我写了一个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();
}
}
}
?>
答案 0 :(得分:2)
您可以让cron作业每分钟运行一次。
要执行此操作,请按以下步骤操作:
制作一个运行PHP代码的脚本,例如:
#!/bin/bash
wget myurl.com/blah > /dev/null
将其保存为my-cron.sh
在某个文件夹中(例如/var
)
将其添加到cron。运行crontab -e
查看Cron Format和Crontab usage。
例如,这将每分钟运行一次。
# Minute Hour Day of Month Month Day of Week Command
* * * * * /var/my-cron.sh
答案 1 :(得分: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();
我希望这会有所帮助
修改
此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'
}
}