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?是的,对不起,我指的是虚拟专用服务器