如何将需要很长时间才能运行的PHP脚本拆分为较小的块?

如何将需要很长时间才能运行的PHP脚本拆分为较小的块?,php,Php,我有一个初始化图像库的PHP脚本。它在所有图像中循环,检查它们是否有缩略图,并为它们添加水印 我的共享主机帐户只允许我在php.ini设置中为每个脚本执行30秒。我不能改变 我能做些什么来避免这件事?目前,我每5幅图像刷新一次页面,这可以防止脚本超时,但浏览器会发现脚本无法完成,并给出一个错误。没关系,但它不是真正的用户友好 有什么建议吗?三个想法: 您可以将其卸载到服务器上运行的脚本(可能是PHP CLI?),并让当前脚本检查进度(仍在运行!稍后再检查!) 如果javascript在您的环境中

我有一个初始化图像库的PHP脚本。它在所有图像中循环,检查它们是否有缩略图,并为它们添加水印

我的共享主机帐户只允许我在php.ini设置中为每个脚本执行30秒。我不能改变

我能做些什么来避免这件事?目前,我每5幅图像刷新一次页面,这可以防止脚本超时,但浏览器会发现脚本无法完成,并给出一个错误。没关系,但它不是真正的用户友好

有什么建议吗?

三个想法:

  • 您可以将其卸载到服务器上运行的脚本(可能是PHP CLI?),并让当前脚本检查进度(仍在运行!稍后再检查!)

  • 如果javascript在您的环境中正常,那么您也可以调用ajax来处理这个问题。第一种解决方案允许用户在站点上四处游荡,但不确定这是否是您的重要考虑因素

  • 您可以让PHP脚本只执行特定的批处理(比如一次10个图像),然后使用进度报告刷新页面,然后再执行10个,而不是基于任意时间的刷新


  • 获取图像列表,然后循环浏览它们 例如,您总共获得500个IMG,一次可以获取5个,完成后输出一个元刷新标记,该标记将在2秒钟内重新加载脚本,例如使用您当前的图像编号作为参数

    <meta http-equiv="refresh" content="2;url=script.php?start=5">
    
    
    

    在您的脚本中,还要检查$_GET['start']是什么,然后从那里继续下5个图像,然后输出start=10,这样就有一个。。。直到您循环所有任务。

    某种任务列表怎么样,例如:

  • 第一个脚本列出需要缩略图或水印的图像
  • 第二个脚本检查此列表,并执行前5个左右的操作(在时间限制内可以完成许多操作),然后将它们从列表中删除
  • 让步骤2中的脚本返回一个值,告诉您列表是否为空,如果不是,则重复步骤2(使用ajax可能最简单)

  • 使用此方法,整个时间内唯一“运行”的是浏览器中的页面,每个脚本只运行30秒。

    您可以使用,尽管有些主机可能不支持此方法,但大多数主机现在都支持。

    我认为,如果每个页面加载超过30秒,则表明出现了其他问题。你有多少张照片?您是否在磁盘上存储水印/缩略图版本?如果您不这样做,那么您的答案是:当然,它可能会占用一些空间,但它将完全避免这个问题,并允许客户端缓存图像


    如果您确信这样做是唯一的方法,那么请查看增加脚本运行时间的函数。

    也许您应该避免批处理,并创建一个代理生成脚本,按需为每个图像执行此过程

    在代理PHP脚本中重写转换代码,该脚本检查图像是否已经被缩略图,如果没有,则执行需要执行的操作。 然后可以使用
    fpassthru()
    加载带有缩略图或水印的文件并将其发送到客户端

    您的网页应该只引用代理脚本,如

    <img src="/image.php?DSC001.JPG">
    
    
    

    如果您的提供商支持Apache/重写,那么如果已经创建了缩略图,您可以通过绕过代理/生成脚本来实现更神奇的效果

    您可能还想尝试优化脚本。你在循环中做的太多了吗?你能把东西从循环中移开吗?您使用什么来获取文件列表?有没有更轻巧的方法?这些是关于你的剧本你可以问自己的问题,这样你就可以不把剧本拆分,而让整个剧本按时运行


    如果做不到这一点,我同意欧文关于使用AJAX的建议。当用户启动该进程时,您将正常输出一个页面,然后发回处理带外文件的请求,然后在文件进入时将状态更新写入页面。

    在共享主机环境上,我不建议您运行可能需要30秒以上才能处理的脚本,甚至不要考虑设置时间限制。我的建议是,你要么在图片上传时做缩略图,要么做水印?或图片请求,并将图片标记为已完成,这样您就不必再次执行。另一个选项是运行批处理,例如每分钟或每10分钟处理10张图片,但通过crontab中的cli运行脚本


    在运行批处理脚本时,始终了解脚本可能使用的资源量是一种很好的做法……尤其是在共享主机环境中……这会很容易影响其他用户。

    php cli听起来是个不错的主意-我必须检查是否有相同的限制……我这样做是为了缩略图。效果很好
    src=“.thumb.image.jpg”
    。如果该文件不存在,请求将落在一个PHP文件上,该文件将生成图像,为图像提供服务,并将图像保存到文件中以备下次使用。傻瓜!