我想在数组中并行执行域。它只能在xampp上运行,而不能在我的网络主机上运行。为什么?
我使用的是:
https://github.com/amphp/parallel
代码:
<?php
require __DIR__ . '/../vendor/autoload.php';
use Amp\Parallel\Worker;
use Amp\Promise;
$urls = [
'https://secure.php.net',
'https://amphp.org',
'https://github.com',
];
$promises = [];
foreach ($urls as $url) {
$promises[$url] = Worker\enqueueCallable('file_get_contents', $url);
}
$responses = Promise\wait(Promise\all($promises));
foreach ($responses as $url => $response) {
\printf("Read %d bytes from %s\n", \strlen($response), $url);
}
?>错误代码如果我在我的网络主机上运行它:
池中的-1 \f25 Worker -1意外退出,代码为-1\f25 250 -1\f6在-1\f25 vendor/amphp/parallel/lib/Worker/DefaultPool.php -1\f6上的-1\f25 250 -1线路意外退出-1\f25-1\f6池中的-1\f25 Worker -1意外退出,代码为-1\f25 250-1\f6。
致命错误:未捕获/kunden/559288_442/webseiten/webhoster/parallel/vendor/amphp/process/lib/Internal/Posix/Runner.php(88):Amp\Process\Internal\Posix\Runner->generateFds() \进程\进程异常:无法在/kunden/559288_442/webseiten/webhoster/parallel/vendor/amphp/process/lib/Internal/Posix/Runner.php:142堆栈跟踪中列出打开的文件描述符:#0 /kunden/559288_442/webseiten/webhoster/parallel/vendor/amphp/process/lib/Internal/Posix/Runner.php(88):Amp\Process\Internal\Posix\Runner->generateFds() #1 /kunden/559288_442/webseiten/webhoster/parallel/vendor/amphp/process/lib/Process.php(108):Amp\Process\Internal\Posix\Runner->start('{ ('/usr/bin/ph...','',数组,数组) #2内部函数: Amp\Process\Process->Amp\Process{closure}() #3 /kunden/559288_442/webseiten/webhoster/parallel/vendor/amphp/amp/lib/Coroutine.php(67):生成器->current() #4 /kunden/559288_442/webseiten/webhoster/parallel/vendor/amphp/amp/lib/functions.php(96):Amp\Coroutine->__construct(Object(Generator)) #5 /kunden/559288_442/webseiten/webhoster/parallel/vendor/Amp/process/lib/process.php(110):Amp\call(Object(Closure)) #6 /kunden/4在/kunden/559288_442/webseiten/webhoster/parallel/vendor/amphp/parallel/lib/Context/Process.php的202行
发布于 2021-02-08 17:24:24
根据提供的信息,您在web主机的服务器上的用户没有读取Amp读取的路径以查找文件描述符的所需权限。有点疏忽。
据我所知(通过阅读Amp源代码),当你的web主机不支持线程时,创建一个进程是一种最后的手段,这将是所有共享主机提供商的标准。
使用reactphp/filesystem异步读取文件。我已经能够在过去的共享主机上成功地使用它,即使它也创建子进程。幸运的是,它创建它们是这样一种方式,不需要访问通常在共享主机环境中受保护的目录。
<?php
require dirname(__DIR__) . '/vendor/autoload.php';
// With Amp loop;
// $loop = new Amp\ReactAdapter\ReactAdapter((new Amp\Loop\DriverFactory)->create());
// With React EventLoop;
$loop = \React\EventLoop\Factory::create();
$filesystem = \React\Filesystem\Filesystem::create($loop);
// This returns a react/promise, which can be yielded in amp coroutines
$filesystem->file(__FILE__)->getContents()->then(function ($contents) {
echo $contents, PHP_EOL;
}, function ($e) {
echo $e->getMessage(), PHP_EOL;
});
// You only need this if you are running outside of an Amp Loop.
$loop->run();您可以将reactphp/filesystem与amphp/react-adapter配对,以便在两个库之间共享一个循环。
https://stackoverflow.com/questions/64969809
复制相似问题