假设我有一个文本文件,其中包含网址列表,必须定期从中解析社交媒体评论。我不想一次解析所有页面的注释,因为这是一个很大的负担。我需要每5分钟用一个与该文本文件中的一行相对应的$url
变量来运行脚本。
因此,必须将第一行作为$url
并使用此变量来完成脚本,在5分钟后,变量$url
必须从该文件更改为第二行并使用该脚本来完成脚本,在另外5分钟内,必须对该文件的第三行重复相同的操作,依此类推。当到达最后一行时,必须从头开始。
抱歉,无法显示任何尝试,因为我不知道如何实现,也无法提出适当的搜索请求。
答案 0 :(得分:1)
第一步,您应该设置cron作业(例如:cron.php
),该作业每5分钟执行一次。
*/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.txt
和index.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)
循环中,而永远不要让它“完成”。
答案 3 :(得分:0)
如果只想使用当前正在使用的内容(PHP和该文本文件)执行此操作,则可以在处理文本文件时从文本文件中删除该第一行,然后将其附加到末尾'重做。您要么必须打开两个连续的文件句柄,要么使用一个文件句柄查找文件的末尾,但是您不需要任何其他数据结构/ SQL /您拥有什么。每五分钟盲目启动cron时,使文本文件本身旋转。