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(并且您不需要对多线程进行任何配置,它具有针对多线程的默认配置。)

将图像转换逻辑移动到作业中并将其推送到队列中。然后启动队列工作者,它将在一个单独的进程中处理它,而不会阻塞主线程。