在给定的时间段内运行相同的脚本,但使用不同的变量

时间:2019-03-05 19:17:12

标签: php cron

假设我有一个文本文件,其中包含网址列表,必须定期从中解析社交媒体评论。我不想一次解析所有页面的注释,因为这是一个很大的负担。我需要每5分钟用一个与该文本文件中的一行相对应的$url变量来运行脚本。

因此,必须将第一行作为$url并使用此变量来完成脚本,在5分钟后,变量$url必须从该文件更改为第二行并使用该脚本来完成脚本,在另外5分钟内,必须对该文件的第三行重复相同的操作,依此类推。当到达最后一行时,必须从头开始。

抱歉,无法显示任何尝试,因为我不知道如何实现,也无法提出适当的搜索请求。

4 个答案:

答案 0 :(得分:1)

第一步,您应该设置cron作业(例如:cron.php),该作业每5分钟执行一次。

crontab

*/5 * * * * /path_to_your_cron_php/cron.php

让我们假设您以这种简单的txt格式将网址保存在名为file.txt的文件中。

file.txt

https://www.google.com/
https://www.alexa.com/
https://www.yourdomain.com/

让我们创建一个文件,该文件将在index.txt中保留我们接下来要执行的url的索引,该文件只有1行和1个值。

index.txt

0

cron.php

<?php

$fileWithUrl  = '/path/to/your/file.txt';
$index  = (int)file_get_contents('/path/to/your/index.txt');
$urls = file($fileWithUrl);
$maxIndex = count($urls);
$url = $urls[$index];
your_parse_function($url);
file_put_contents('/path/to/your/index.txt',($index >= $maxIndex) ? 0 : $index++);

如您所见,该脚本读取file.txtindex.txt的内容。将第一个转换为网址数组,并将index.txt转换为整数索引。 执行your_parse_function()后,此脚本将使用递增的索引替换index.php的内容,或者如果它大于我们在file.txt中拥有的URL数量,则将其重置为0。

答案 1 :(得分:1)

由于变量不会在不同的运行过程中持续存在,因此您需要跟踪已解析的变量和未包含在代码之外的变量。

最有效的方法是将一个信号量表与每个URL放在一行上,并与已解析/待处理标志配对。 每次cron运行时,从信号量表中选择标记为pending的一行:

假设它已在mysql上完成:

select url
from semaphore
where status='pending'
limit 1;

这将选择一个尚未解析的网址(无论是哪个网址)。将其作为解析器的输入,解析后,将标志更新为parsed,以使其不再被选择。

其他方法是在文本文件或数据库表上保留一个计数器。每次cron运行时,请检查计数器是什么并处理下一个数字。处理后,将计数器更新为当前值+1。

编辑: 这可能是通过可变的URL列表解决重复问题的简单方法

1.-创建一个包含以下字段的表: id,url,状态(待定/已解析),last_updated(日期时间)

2.-每次运行cron:

select url from semaphore where status='pending' order by last_updated asc limit 1

3.-如果返回URL,请进行处理。完成后,将状态更新为parsed并将last_updated更新为当前时间戳。 如果未返回任何内容,请将每一行更新为status = pending(但不更新last_updated字段),然后重新运行以上查询。

这样做,可以确保从头开始,您将首先处理已经“等待”较长时间的url

答案 2 :(得分:0)

默认情况下,PHP几乎是无状态的,因此一旦脚本执行完毕,一切都会被清除。

我将做什么:尝试for循环,并使用PHP的sleep()函数在URL之间进行分隔。您可以将该循环作为cron作业运行(更好),也可以将其放入while (true)循环中,而永远不要让它“完成”。

https://secure.php.net/manual/en/function.sleep.php

答案 3 :(得分:0)

如果只想使用当前正在使用的内容(PHP和该文本文件)执行此操作,则可以在处理文本文件时从文本文件中删除该第一行,然后将其附加到末尾'重做。您要么必须打开两个连续的文件句柄,要么使用一个文件句柄查找文件的末尾,但是您不需要任何其他数据结构/ SQL /您拥有什么。每五分钟盲目启动cron时,使文本文件本身旋转。