如何运行内存密集型PHP任务(图像转换和OCR)?

时间:2016-02-09 16:57:16

标签: php laravel nginx webserver

我确定StackOverflow中是否允许使用这种Q,但我主要是在寻求建议。

我有一个网络应用程序接受PDF上传,将它们转换为TIFF,然后使用Tesseract进行OCR。

这些PDF长度超过50 - 200页。我的服务器为少于6页的PDF完成此操作。

结果TIFF为1.2GB。 PDF只有98KB。我们有一些已经有数百MB的PDF,所以谁知道它们最终会转换成什么样的结果。这个大小似乎是错误的,但现在让我们把它放在一边。

一旦我们开始讨论200页的PDF,就没有任何作用。我收到错误:

exec(): Unable to fork [tesseract '/home/forge/default/storage/app/ocr/1.tiff' /tmp/tesseractbO7aur -psm 3  2>&1]

即使使用大型PDF,TIFF转换也能正常工作。但是当PDF超过6页时,Tesseract总是会出现这个错误。

也许我只需要更多的记忆。我的问题是:

如何确定要点击的限制/最大值是什么?我如何知道这是RAM问题,CPU问题还是其他问题?

你会如何运行?我应该将它保留在我们的网络服务器上并且只是显着增加规格吗?或者你会制作另一台专门用于生产OCR的机器吗?他们不需要立即响应用户事件 - 如果他们上传并且OCR甚至需要几个小时就可以。我已经习惯了需要大量时间的应用程序,而不是完全死亡。只要过程不会失败,OCR就可以花很长时间。

我只使用简单的网络应用程序,用户发出请求并显示页面。我不习惯这种东西。我正在使用Laravel作为应用程序,因此如果应该使用它,我可以访问Redis队列等。我在AWS上使用Nginx。我确实考虑过AWS Lambada,但我认为这不能达到我的需要。

谢谢,我希望有人可以提供帮助。

萨姆

2 个答案:

答案 0 :(得分:0)

我怀疑这与PHP无关。

首先,您需要确保可以直接在命令行上使用Tesseract运行此过程。

打开两个SSH sesssions,在一次运行中使用htop来监控服务器资源,然后在第二次尝试手动运行转换过程。

如果您看到资源使用情况和负载平均值在htop中疯狂,那么您就知道您需要更强大的服务器,或者找到更有效的方法来运行任务。

只有在您知道它可以在命令行上手动工作时,如果您尝试通过PHP实现此功能。

即使使用PHP,我也建议使用某种作业队列来安排转换任务。

答案 1 :(得分:0)

我通过在庞大的AWS EC2实例上运行它来解决这个问题。较小的EC2实例也会出现同样的问题。通过转换运行500页PDF,OCR适用于计算优化的c4.4xlarge(600美元/月)。