运行一个不确定的PHP脚本一个小时。每小时重启一次

时间:2013-03-05 21:44:48

标签: php process cron restart

我写了一个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();
            }
        }
    }
?>

3 个答案:

答案 0 :(得分:2)

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

要执行此操作,请按以下步骤操作:

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

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

    将其保存为my-cron.sh在某个文件夹中(例如/var

  2. 将其添加到cron。运行crontab -e查看Cron FormatCrontab usage。 例如,这将每分钟运行一次。

    # Minute   Hour   Day of Month   Month   Day of Week    Command    
        *        *          *          *          *         /var/my-cron.sh
    

答案 1 :(得分:2)

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

作为其中一条评论中的说明人,您使用的是托管服务器 Godaddy ,因此您可能无法访问shell,,具体取决于您的cPanel版本也许能够创建和定义cron作业。

请参阅this link和此google search

也许,如果你没有这个选项并且你想让浏览器打开我会建议以下

  

创建一个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();

我希望这会有所帮助

  

修改

     

link也可能有所帮助

     

重要 请勿忘记删除无限循环

答案 2 :(得分: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'
}
}