[英]amphp libary works on xampp but not on my webhoster
我想並行執行數組中的域。 它可以工作,但只能通過 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);
}
?>
錯誤代碼如果我在我的網絡主機上運行它:
在供應商/amphp/parallel/lib/Worker/DefaultPool.php 上,池中的工作人員以代碼 -1 第 250 行意外退出池中的工作人員在代碼 -1 第 250 行上意外退出
致命錯誤:未捕獲的 Amp\\Process\\ProcessException:無法在 /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...', '', Array, Array) #2 [內部函數]: Amp\\Process\\Process->Amp\\Process{closure}() #3 /kunden/559288_442/webseiten/webhoster/parallel/vendor/amphp/amp/lib/ Coroutine.php(67): Generator->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/amphp/process/lib/Process.php(110): Amp\\call(Object(Closure)) #6 /kunden/4 in /kunden/ 559288_442/webseiten/webhoster/parallel/vendor/amphp/parallel/lib/Context/Process.php 在線 202
根據提供的信息,您在 Web 主機服務器上的用戶沒有讀取 Amp 為查找文件描述符而讀取的路徑所需的權限。 一種疏忽。
據我所知(通過閱讀 Amp 源代碼)當您的網絡主機不支持線程時,創建進程是最后的手段,這將成為所有共享主機提供商的標准。
使用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 配對以在庫之間共享單個循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.