0

我编写了一个 PHP 脚本来从 Twitter firehose 中提取推文并将它们存储到数据库中。理想情况下,我只想让它运行,以便随着时间的推移收集推文,因此,它被包裹在一个while(1)循环中。

这似乎是有问题的,因为它正在超时。如果我只是在浏览器中运行它,它不会运行超过 30 秒,然后超时并给我一个 324 错误。

问题:有没有办法让它运行一段时间(20秒),自动杀死自己,然后重新启动?全部在 cron 工作中(PS...我不知道如何编写 cron 工作)?

背景:网站托管在 Godaddy 上。理想情况下希望在我的托管服务器上运行它。

剧本:

<?php
    $start = time();
    $expAddress = "HOSTNAME";
    $expUser = "USERNAME";
    $expPwd = "PASSWORD";
    $database = "DBNAME";

    $opts = array(
        'http' => array(
            'method'    =>  "POST",
            'content'   =>  'keywords,go,here',
        )
    );

    // Open connection to stream
    $db = mysql_connect($expAddress, $expUser, $expPwd);
    mysql_select_db($database, $db);

    $context = stream_context_create($opts);
    while (1) {
        $instream = fopen('https://USERNAME:PASSWORD@stream.twitter.com/1/statuses/filter.json','r' ,false, $context);
        while(! feof($instream)) {

             if(time() - $start > 5) { // break after 5 seconds
                break;
             }


            if(! ($line = stream_get_line($instream, 100000, "\n"))) {
                continue;
            }
            else {
                $tweet = json_decode($line);

                // Clean before storing             

                            // LOTS OF VARIABLES FOR BELOW...REMOVED FOR READABILITY

                // Send to database
                $ok = mysql_query("INSERT INTO tweets 
                    (created_at, from_user, from_user_id, latitude, longitude, tweet_id, language_code, 
                            place_name, profile_img_url, source, text, retweet_count, followers_count,
                            friends_count, listed_count, favorites_count) 
                    VALUES 
                    (NOW(), '$from_user', '$from_user_id', '$latitude', '$longitude', '$tweet_id', '$language_code', 
                            '$place_name', '$profile_img_url', '$source', '$text', '$retweet_count', '$followers_count',
                            '$friends_count', '$listed_count', '$favorites_count')");

                if (!$ok) { echo "Mysql Error: ".mysql_error(); }

                flush();
            }
        }
    }
?>
4

3 回答 3

3

您可以让 cron 作业每分钟运行一次。

为此,请按照下列步骤操作:

  1. 制作一个运行 PHP 代码的脚本,例如:

    #!/bin/bash
    wget myurl.com/blah > /dev/null
    

    将其另存为my-cron.sh某个文件夹(如/var

  2. 将其添加到 cron。运行crontab -e请参阅Cron 格式Crontab 用法。例如,这将每分钟运行一次。

    # Minute   Hour   Day of Month   Month   Day of Week    Command    
        *        *          *          *          *         /var/my-cron.sh
    
于 2013-03-05T21:55:05.963 回答
2

如果我能满足您的需求,那么对您来说最好的办法是cron job让脚本无限期地运行并不是一个好主意。

作为其中一个评论中的说明符,您正在使用托管服务器Godaddy,因此您可能无法获得 shell 访问权限,取决于您的 cPanel 版本,您可能能够创建和定义 cron 作业。

看到这个链接和这个谷歌搜索

也许,如果您没有此选项并且您希望打开浏览器,我会建议以下

创建一个 html 页面作为客户端,它会每小时向你的 PHP 脚本发出一个 ajax 请求,就像这样你模拟一个 cron 作业函数

ajax 请求代码可能看起来像(使用 jQuery)

function makeRequest(){
    $.ajax({
        url: "http://yourhost/url-to-your-script.php",
        complete: function(data){
            setTimeout(function(){
                makeRequest();
            }, 60 * 60 * 1000); // Minutes * Seconds * MS
        }
    });
}
makeRequest();

我希望这有帮助

编辑

这个链接也可能有帮助

重要不要忘记删除无限循环

于 2013-03-05T22:00:09.303 回答
0
I just had same issue.

Only cron job can do if you want run script off browser. You can set up cron job with free providers or you can set up cron job in windows's Scheduled tasks.

If your site has a good traffic then you can follow the option below that your users does the work for you.

In php you can find time in hour and seconds 
$time= date(' H:i:s');
create a table to track if the code was run.
eg; table column  name check with option 0 and 1;

select check from table.

    enter code here

if ($minute > 59)
{
if($check==0)
{
run your code
then update the table each time when it was run
eg; update table set check='1' 
}
}

then another if condition to reset your code
if(minute>0 && minute <1)
{
select check from your table.
if(check==1)
{
update table set check='0'
}
}
于 2016-12-26T05:21:18.970 回答