php - 将PDF转换为图像时,PHP Imagick会挂起整个服务器
问题描述
我在 PHP 上使用扩展 Imagick 将 PDF 文件转换为图像,具体来说是 PNG 文件。当转换正在进行时,整个服务器总是挂起。我所做的是上传一堆 PDF 文件,循环浏览它及其页面以将其转换为图像。
这是代码。
foreach ($uploaded_file as $key => $value) {
$upload_file_path = $upload_path.'/'.$value->name;
$imagick = new Imagick();
$imagick->setResourceLimit(6, 1);
$imagick->setResolution(300, 300);
$imagick->readImage($upload_file_path);
$pages = $imagick->getNumberImages();
for ($x=0; $x<$pages; $x++) {
$imagick->readImage($upload_file_path.'['.$x.']');
$imagick->setImageFormat('png');
$imagick->writeImage($image_path.'/page-'.$x.'.png');
}
$imagick->clear();
$imagick->destroy();
}
转换正在进行时,我无法访问服务器上的其他站点,并且转换时间过长。请帮忙。谢谢!
解决方案
根据 PDF 的内容,转换可能确实非常繁重。您对此无能为力。
您已经尝试将线程总数降低到 2,但仍然需要考虑内存、I/O 延迟和 CPU 资源——而且您不知道服务器是否可以使用两个以上的线程。
您可能可以做的是尝试使用 and 降低正在运行的进程的 I/O 和 CPU 优先级nice
,ionice
如果它们可用的话。您需要有一个合适的平台(Linux、BSD 或类似平台),并且可以使用nice
和ionice
工具;并且您需要一个专用的可执行 PHP 进程(可能不是 FastCGI,然后)并能够查询其 PID。
在 Linux 系统上,您可能会尝试将转换外包给 ImageMagick 二进制文件,然后将其包装起来,nice
使其ionice
变得容易——而且速度慢。
另一种可能性是看看你是否可以使用ghostscript
而不是 Imagick。
推荐阅读
- c++ - 变量 'pos' 未经初始化就被使用
- xamarin.forms - 错误:值不能为空。参数名称:路径 1,添加新的 Azure 移动应用表控制器时
- asp.net-core - ASP.NET Core 启动异常处理
- azure - Azure Active Directory、企业应用程序、应用程序角色的密钥/访问密钥?
- python - 使用 pandas 获取新列(其他元素的共识)
- datetime - 如何设置需要 2 个月的时间变量(双月数据)?
- sqlite - 在表级别上定义的 PRIMARY KEY 约束是否保证 AUTOINCREMENT 并且没有值重用?
- javascript - 使用快速路由器时如何实现 MongoDB 排序
- javascript - 我如何用 ramda 编写该函数?
- javascript - 将 jquery 变量值插入输入隐藏字段