Php Don';不要等待文件获取内容()完成
有没有一种方法可以调用多个Php Don';不要等待文件获取内容()完成,php,multithreading,performance,Php,Multithreading,Performance,有没有一种方法可以调用多个file\u get\u contents,而不必等待第一个文件完成。我有一些PHP脚本,它们可以做一些繁重的工作,其中一个脚本的执行时间超过1.5分钟,所以我想同时调用它们以减少执行时间。目前我有多个文件内容,但要运行下一个文件内容,第一个需要先完成。我尝试了exec方法,但它在服务器上被阻止了(共享主机)。如果您正试图实现这一点,那么可以并行运行任务,但请记住PHP是一种高级脚本语言,其最初目的是服务无状态HTTP请求 还有一些扩展,比如,这个扩展允许应用程序并行完
file\u get\u contents
,而不必等待第一个文件完成。我有一些PHP脚本,它们可以做一些繁重的工作,其中一个脚本的执行时间超过1.5分钟,所以我想同时调用它们以减少执行时间。目前我有多个文件内容,但要运行下一个文件内容,第一个需要先完成。我尝试了exec
方法,但它在服务器上被阻止了(共享主机)。如果您正试图实现这一点,那么可以并行运行任务,但请记住PHP是一种高级脚本语言,其最初目的是服务无状态HTTP请求
还有一些扩展,比如,这个扩展允许应用程序并行完成任务
显然,这将是你的风向标,因为你可能只是使用一个托管服务。获得类似vps的服务,vps比大多数web托管服务更便宜。是的,这是可能的!但这有点棘手 你必须玩
叉子
。
我同意排队和其他。。。但仅仅为了能力,这里有一个例子:
<?php
declare(ticks = 1);
$a = [
'https://twitter.com',
'https://facebook.com',
'https://stackoverflow.com',
'https://linkedin.com',
'https://github.com',
];
// Count of php threads (forks or processes).
$max = 3;
// Child counter.
$child = 0;
pcntl_signal(SIGCHLD, function ($signo) {
global $child;
if ($signo === SIGCLD) {
while (($pid = pcntl_wait($signo, WNOHANG)) > 0) {
$signal = pcntl_wexitstatus($signo);
$child--;
}
}
});
foreach ($a as $item) {
while ($child >= $max) {
sleep(1);
}
$child++;
$pid = pcntl_fork();
if ($pid) {
} else {
// Child fork.
sleep(1);
// HERE YOUR CODE:
echo file_get_contents($item);
exit(0);
}
}
while ($child != 0) {
sleep(1);
}
我不是一个可以判断的人,而是共享托管和90秒文件获取内容执行时间。这是一个处方过度使用,并有你的主机被禁止(违反公平使用政策)。我建议您调查排队请求,并通过CRON在一天中平均处理这些请求。@JamieBicknell我同意,但是如果使用共享主机,CRON肯定不可用,因此需要自定义任务队列。我从未遇到过任何信誉良好的共享主机不允许CRON。但是,它们会有一些限制,比如最小运行时间是每10或15分钟一次,最大执行时间是60秒,但是一个体面的共享主机会有cron。代码中有没有办法限制fork的数量,例如,如果传递了一个包含200个链接的数组,这是200个同步的文件获取内容
尝试并行工作,这将爬行<代码>$max
似乎没有被使用。@Martin是的,这里有限制,它是$max
),它被使用:而($child>=$max){
。在本例中,我们有3个线程。@Martin np!)感谢您的关注!您的,而它所做的一切都是等待一秒钟再继续,因此似乎没有限制fork的执行次数(仍然会有200个调用,只需在196秒内进行)。如果每个文件\u获取\u内容
调用需要1.25秒才能完成,则仍会导致系统崩溃drain@Martin另外,在htop
或ps aux|grep thisScriptName
中,您可以观察实际进程数…您是指vps,而不是vpn?是的,对不起,我指的是虚拟专用服务器