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

Php 运行相同的脚本,但在每个给定的时间段使用不同的变量,php,cron,Php,Cron,假设我有一个文本文件,其中有一个URL列表,社交媒体评论必须定期从中解析。我不想一次解析来自所有页面的评论,因为这是一个很大的负载。我需要每5分钟使用与该文本文件中的一行对应的不同$url变量运行脚本 因此,它必须将第一行作为$url并使用此变量完成脚本,5分钟后变量$url必须更改为该文件的第二行并使用它完成脚本,再过5分钟,必须对该文件的第三行重复此操作,依此类推。当它到达最后一行时,它必须从头开始 很抱歉,无法显示任何尝试,因为我不知道如何实现它,也无法提出适当的搜索请求。作为第一步,您应

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

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


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

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

假设您的URL位于名为
file.txt
的文件中,采用这种简单的txt格式

file.txt

https://www.google.com/
https://www.alexa.com/
https://www.yourdomain.com/
让我们在
index.txt
中创建一个文件,在其中保存下一个要执行的url的索引,该文件只有一行和一个值

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++);

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

假设您的URL位于名为
file.txt
的文件中,采用这种简单的txt格式

file.txt

https://www.google.com/
https://www.alexa.com/
https://www.yourdomain.com/
让我们在
index.txt
中创建一个文件,在其中保存下一个要执行的url的索引,该文件只有一行和一个值

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++);

由于变量不会在不同的运行中保持不变,因此您需要跟踪已解析的变量和代码之外的变量

最有效的方法是使用一个信号量表,每个URL位于一行上,并与一个已解析/挂起标志配对。 每次运行cron时,从标记为
挂起的信号量表中选择一行:

假设它是在mysql上完成的:

select url
from semaphore
where status='pending'
limit 1;
这将选择一个(任意一个)尚未解析的url。将其作为解析器的输入,在解析之后,将标志更新为
parsed
,这样就不会再次选中它

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

编辑: 这可能是一个简单的方法来解决您的重新迭代与一个可变的URL列表

1.-创建包含以下字段的表: id、url、状态(待定/已解析)、上次更新(日期时间)

2.-每次运行cron时:

select url from semaphore where status='pending' order by last_updated asc limit 1
3.-如果返回url,则处理该url。完成后,将状态更新为
parsed
,最后更新为当前时间戳。 如果没有返回任何内容,请将每一行更新为status=
pending
(但不是
last\u updated
字段),然后重新运行上述查询


通过这样做,您可以确保在重新开始时,您将首先处理“等待”时间更长的url,因为变量不会在不同的运行中保持不变,所以您需要跟踪已解析的变量和代码之外的变量

最有效的方法是使用一个信号量表,每个URL位于一行上,并与一个已解析/挂起标志配对。 每次运行cron时,从标记为
挂起的信号量表中选择一行:

假设它是在mysql上完成的:

select url
from semaphore
where status='pending'
limit 1;
这将选择一个(任意一个)尚未解析的url。将其作为解析器的输入,在解析之后,将标志更新为
parsed
,这样就不会再次选中它

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

编辑: 这可能是一个简单的方法来解决您的重新迭代与一个可变的URL列表

1.-创建包含以下字段的表: id、url、状态(待定/已解析)、上次更新(日期时间)

2.-每次运行cron时:

select url from semaphore where status='pending' order by last_updated asc limit 1
3.-如果返回url,则处理该url。完成后,将状态更新为
parsed
,最后更新为当前时间戳。 如果没有返回任何内容,请将每一行更新为status=
pending
(但不是
last\u updated
字段),然后重新运行上述查询


通过这样做,您可以确保在重新开始时,您将首先处理“等待”时间更长的url。默认情况下,PHP是非常无状态的,因此一旦脚本完成执行,所有内容都将被删除

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


默认情况下,PHP是非常无状态的,因此一旦脚本执行完毕,所有内容都将被删除

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


如果只想对当前使用的内容(PHP和该文本文件)执行此操作,则可以在处理文本文件时从中删除第一行,然后在完成后将其追加到末尾。您要么必须打开两个连续的文件句柄,要么使用一个句柄查找文件末尾,但不需要任何其他数据结构/SQL/what。做最后的决定