PHP-将Cron Jobs和GD结合使用


PHP - Using Cron Jobs and GD together

我有一个基于客户的网站,要求他们上传图像,这样我的脚本将使用GD库将大约25-30个图像变体保存到服务器上。由于图像数量太多,目前客户需要很长时间才能继续在网站上等待,直到创建并保存所有图像。在此之前,他们无法继续,因此我们有大量客户离开网站。

上传后,是否可以将图像url存储在数据库表记录中,然后使用php脚本创建25-30个图像,提取数据库中的每个记录,并使用cronjob每天每5分钟运行一次。通过这种方式,它允许客户继续浏览网站,并在"后台"自动创建图像

所有这些在后台发生的事情会对我的网站速度造成任何问题吗?它会减缓人们浏览网站的速度吗?尤其是如果10-100名客户同时使用它?

我建议开始查看队列,更具体地说是Gearman。

这将减少客户的加载时间,因为您可以将图像的生成卸载到单独的服务器。如果您需要更多的处理能力,它可以轻松地跨多个服务器进行扩展。

让PHP脚本处理图像不会比客户上传图像并实时等待处理完成时在cron作业中造成更多延迟。简而言之,不,这种方法没有任何额外的影响。

问题是,您需要确保您的cron作业具有自我意识,不会产生重叠。例如,如果cron运行并花费5分钟以上的时间来完成其当前任务,那么当第二个cron启动并开始处理另一个映像(或者如果您没有正确实现队列,则处理同一个映像)时会发生什么?好吧,现在你有两个亲信在竞选,争夺资源。这意味着第二次也可能需要5分钟以上的时间。最终,您可以同时运行3、4等cron。因此,如果还没有运行cron,请确保您的cron只是在"启动"。

话虽如此,你最好让另一台服务器来处理图像处理,这取决于你客户网站的大小和流量。你可以在一个集群中有一台云服务器和你的生产网站服务器,它可以通过本地网络连接来访问图像,处理图像,并将25-30份副本返回到适当位置的服务器。这样,您的处理队列占用了面向公众的web服务器的0个资源,并且不会对网站本身的速度产生影响。

当然,您可以将映像的PATH存储在服务器上,稍后再进行处理。创建php脚本,该脚本在运行时创建一个LOCK文件,即"/tmp/imgprocessor.LOCK",并在最后将其删除,如果cron启动了一个新进程,则首先检查该文件是否存在。我会将上传的图像存储在ie pathtoimages/toprocess/中,并在处理后删除每个图像或将其移动到其他地方。在ie/已处理/中有新图像

这样,您就不需要在数据库中查询图像的路径,只需处理"toprocess"文件夹中的内容,就可以在表中包含UNIQ_NAME_of_IMAGE。在加载oage之前,请在web脚本中检查"已处理"文件夹中是否存在UNIQ_NAME_OF_IMAGE,如果存在,请显示它。。。

在服务器负载方面,这取决于您最初拥有的图像数量和大小,图像处理在服务器上可能很繁重,但处理1000个用户*30个图像不会是一项繁重的任务,正如我所说,这取决于图像的大小。

注意:如果采用这种方式,则需要确保在启动cron ERROR日志时,也会将其输出到某个日志文件中。Cron脚本必须是防弹的,即如果由于某种原因失败,LOCK文件将保留,因此不会发生更多的处理,您将需要手动删除它(或创建自定义错误处理程序来删除它,并可能发送一些邮件),您应该定期检查日志文件,以便了解发生了什么。