Laravel 主线程阻塞
Laravel Main Thread Blocked
Objective就是把pdf的每一页都转成图片。因此,我使用 php Imagick and php-vips 进行此操作。这些库可以很好地完成任务,但问题是,一旦转换操作开始,主 php 线程就会被阻塞。含义:任何用户都不能访问任何页面、路由。此时也无法接收或发送请求。所以基本上服务器只是停止所有请求并将它们置于待定状态,直到 pdf 转换完成。这是转换代码:
for ($n = 0; $n < $pageCount; $n++) {
//Using php vips
$page = Vips\Image::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
问题:如何解决这个阻塞问题?也许工作队列,异步任务?计划?任何想法都有帮助。谢谢。
重要说明:这是本地环境,运行它使用“php artisan serve”。
环境规格:
Laravel 5.7
Ubuntu
8GB DDR3 内存
8核cpu
当您使用 php artisan serve
为您的应用程序提供服务时,PHP 只有一个线程并且很忙。这就是您无法处理任何其他网页请求的原因。
PHP 线程同时工作。在你的情况下,你有一个。
但是你的服务器上可以有多个线程。
就像使用 Nginx 和 PHP-fpm(并且您不需要对多线程进行任何配置,它具有针对多线程的默认配置。)
将图像转换逻辑移动到作业中并将其推送到队列中。然后启动队列工作者,它将在一个单独的进程中处理它,而不会阻塞主线程。
Objective就是把pdf的每一页都转成图片。因此,我使用 php Imagick and php-vips 进行此操作。这些库可以很好地完成任务,但问题是,一旦转换操作开始,主 php 线程就会被阻塞。含义:任何用户都不能访问任何页面、路由。此时也无法接收或发送请求。所以基本上服务器只是停止所有请求并将它们置于待定状态,直到 pdf 转换完成。这是转换代码:
for ($n = 0; $n < $pageCount; $n++) {
//Using php vips
$page = Vips\Image::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
问题:如何解决这个阻塞问题?也许工作队列,异步任务?计划?任何想法都有帮助。谢谢。
重要说明:这是本地环境,运行它使用“php artisan serve”。
环境规格:
Laravel 5.7
Ubuntu
8GB DDR3 内存
8核cpu
当您使用 php artisan serve
为您的应用程序提供服务时,PHP 只有一个线程并且很忙。这就是您无法处理任何其他网页请求的原因。
PHP 线程同时工作。在你的情况下,你有一个。 但是你的服务器上可以有多个线程。
就像使用 Nginx 和 PHP-fpm(并且您不需要对多线程进行任何配置,它具有针对多线程的默认配置。)
将图像转换逻辑移动到作业中并将其推送到队列中。然后启动队列工作者,它将在一个单独的进程中处理它,而不会阻塞主线程。