0

Twitter ファイアホースからツイートを取得してデータベースに保存する PHP スクリプトを作成しました。理想的には、時間の経過とともにツイートを収集するように実行したいので、while(1)ループにラップされます。

タイムアウトしているため、これは問題があるようです。ブラウザで実行すると、タイムアウトして 324 エラーが発生するまでに 30 秒以上実行されません。

質問:一定時間 (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

1 分に 1 回、cron ジョブを実行できます。

これを行うには、次の手順に従います。

  1. PHP コードを実行するスクリプトを作成します。次に例を示します。

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

    フォルダに名前を付けて保存しmy-cron.shます(のように/var

  2. cron に追加します。実行Cron FormatおよびCrontab の使用法crontab -eを参照してください。たとえば、これは 1 分に 1 回実行されます。

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

私があなたの必要性を理解した場合、あなたにとって最善の方法はcron job、スクリプトを無期限に実行することは良い考えではありません.

コメントの 1 つの指定子として、ホスティング サーバーGodaddyを使用しているため、おそらくシェル アクセスはできませんが、 cPanelのバージョンによっては、cron ジョブを作成および定義できる場合があります。

このリンクとこのGoogle検索を参照してください

おそらく、このオプションがなく、ブラウザを開いたままにしたい場合は、次のことをお勧めします

PHPスクリプトに対して毎時間ajaxリクエストを行うクライアントとしてhtmlページを作成します。このように、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 に答える