代码之家  ›  专栏  ›  技术社区  ›  significance

长进程PHP

  •  3
  • significance  · 技术社区  · 14 年前

    我需要运行一个非常长的PHP脚本(四个半小时,五个小时)。

    脚本有时运行成功,但有时会被莫名其妙地杀死(可能与共享主机有关吗??)

    我认为运行脚本的解决方案可能是更小的块。

    为了做到这一点,我编写了一个脚本,将它的状态和位置存储在XML文件中,并在移动位置之前执行脚本的一块。

    我在连接脚本的最后一位时遇到问题,这将结束当前进程并重新执行脚本。

    或者我完全找错树了!

    我已经通读了我在某地和其他地方所能找到的东西,但我还是一点也不明智:(

    请帮助!!!!

    5 回复  |  直到 14 年前
        1
  •  2
  •   elias    14 年前

    考虑到您有一个永远运行但不会导致数据不一致的脚本,您可以使用cronjob。

    问题是,您需要知道脚本是否仍在运行,因为您可能不想启动两次。我想到的两个解决方案是脚本的进程ID(getmypid())或使用时间戳。

    PID:

    • 脚本启动时保存pid(到/tmp/script_pid)
    • 每分钟触发cronjob。使用保存PID查找活动进程,如果找不到,则启动。

    您需要访问php的exec()(和friends)和命令行工具,比如linux的“ps”。

    时间戳:

    • 每次迭代保存时间戳。
    • 每分钟触发cronjob。如果时间戳早于X,则启动新进程。

    你必须弄清楚X应该是你自己多长时间。

        2
  •  1
  •   Josh K    14 年前

    PHP不是运行长脚本的首选语言。我假设你在浏览器中运行这个?尝试通过ssh登录并使用 php /path/to/script.php .

    如果这是您可以在本地运行的,那么您可以在本地计算机上安装一个基本的apache/php安装程序,然后运行它。如果没有shell访问权限,请使用此选项。

        3
  •  1
  •   Hannes Ovrén    14 年前

    如果可能的话,我会尝试将长时间运行的进程拆分为自己的进程。让您的PHP脚本启动计算,然后寻找可能完成计算的线索(类似于包含当前计算进度的状态文件)。然后您甚至可以使用Ajax技术为用户提供一个很好的小进度条;)

        4
  •  1
  •   Kamil Szot    14 年前

    如果您可以访问此服务器上的cron,您可以每分钟运行一次脚本来处理下一个数据块。

        5
  •  0
  •   Naveen Bhalla    14 年前

    我同意乔希的观点,如果可能的话,我建议你用桌面应用程序的其他方式来编程。PHP肯定不是为这种需要运行4-5小时的脚本而构建的。这可以确保最大限度的执行时间或脚本占用了共享主机中的CPU,但移动到桌面应用程序或ssh是我将建议的训练。