目标是将pdf的每一页转换为图像。因此,我使用php-Imagick和php-vips进行此操作。这些库可以很好地完成任务,但问题是,一旦转换操作开始,主php线程就会被阻塞。意思是:任何用户都不能访问任何页面、路线。此时也无法接收或发送请求。所以基本上,服务器只是暂停所有请求,并将它们挂起,直到pdf转换完成。这是转换代码:
for ($n = 0; $n < $pageCount; $n++) {
//Using php vips
$page = VipsImage::newFromFile($pathTarget, [
"dpi" => 200,
"page" => $n,
# this enables image streaming
"access" => "sequential"
]);
$page->writeToFile($pathTarget . "_page_" . $n . ".jpg");
}
这段代码正在使用php-vips库。Imagick库也存在同样的问题。尽管我试图限制Imagick资源,这样php就会有更多的内存和内核,但它并没有解决任何问题。例如:
Imagick::setResourceLimit (6, 1);//for limiting Imagick to 1 CPU core
问题:如何解决此阻塞问题?也许是作业队列,异步任务?cron?任何想法都有帮助。非常感谢。
重要提示:这是一个本地环境,使用"php手工服务">
环境规格:
Laravel 5.7
Ubuntu
8GB DDR3内存
8核cpu
将图像转换逻辑移动到作业中,并将其推送到队列中。然后启动队列工作程序,它将在一个单独的进程中处理它,而不会阻塞主线程。
当您使用php artisan serve
为应用程序提供服务时,PHP只有一个线程,而且它很忙。这就是为什么你不能处理任何其他的网页请求。
PHP线程同时工作。在你的情况下,你有一个。但是你的服务器上可以有多个线程。
就像使用Nginx和PHP fpm一样(你不需要为多个线程进行任何配置,它有多个线程的默认配置。(