如何在作业完成时安排 PHP 脚本(通过 CLI)

发布于 2024-10-07 05:19:12 字数 615 浏览 2 评论 0原文

我正在使用 PHP 处理一个大的 .gz 文件(将数据从 gz 传输到 mysql) 每个 .gz 文件大约需要 10 分钟。 我有很多 .gz 文件需要处理。

PHP 处理完一个文件后,我必须手动更改 PHP 脚本以选择另一个 .gz 文件,然后再次手动运行该脚本。

我希望它自动运行下一个作业来处理下一个文件。 gz 文件被命名为 1, 2 ,3, 4, 5 ... 我可以简单地创建一个像这样的循环(处理文件 1 - 5):

for ($i = 1 ; $i >= 5; $i++)
{
    $file = gzfile($i.'.gz')
    ...gz content processing...
}

但是,由于 gz 文件非常大,我不能这样做,因为如果我使用这个循环,PHP 将运行多个大 gz 文件作为单个文件脚本作业。 (占用大量内存)

我想做的是 PHP 完成一项工作后,我想要一项新工作来处理下一个文件。

也许会是这样的:

    $file = gzfile($_GET['filename'].'.gz')
    ...gz content processing...

谢谢

I am processing a big .gz file using PHP (transfering data from gz to mysql)
it takes about 10 minutes per .gz file.
I have a lot of .gz file to be processed.

After PHP is finished with one file I have to manually change the PHP script to select another .gz file and then run the script again manually.

I want it to be automatically run the next job to process the next file.
the gz file is named as 1, 2 ,3, 4, 5 ...
I can simply make a loop to be something like this ( process file 1 - 5):

for ($i = 1 ; $i >= 5; $i++)
{
    $file = gzfile($i.'.gz')
    ...gz content processing...
}

However, since the gz file is really big, I cannot do that, because if I use this loop, PHP will run multiple big gz files as single script job. (takes a lot of memory)

What I want to do is after PHP is finished with one job I want a new job to process the next file.

maybe its going to be something like this:

    $file = gzfile($_GET['filename'].'.gz')
    ...gz content processing...

Thank You

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

我ぃ本無心為│何有愛 2024-10-14 05:19:12

如果您在处理后清理并使用 unset() 释放所有内存,则只需将整个脚本包装在 foreach (glob(...) as $filename)环形。像这样:

<?php
foreach (glob(...) as $filename) {
    // your script code here
    unset($thisVar, $thatVar, ...);
}
?>

If you clean up after processing and free all memory using unset(), you could simply wrap the whole script in a foreach (glob(...) as $filename) loop. Like this:

<?php
foreach (glob(...) as $filename) {
    // your script code here
    unset($thisVar, $thatVar, ...);
}
?>
酒儿 2024-10-14 05:19:12

你应该做的是

  • 安排一个 cronjob 每 x 分钟运行你的 php 脚本
  • 当脚本运行时,检查是否有锁定文件,如果没有创建一个并开始处理下一个未处理的 gz 文件,如果是则中止
  • 等待队列被清除

What you should do is

  • Schedule a cronjob to run your php script every x minutes
  • When script is run, check if there is a lock file in place, if not create one and start processing the next unprocessed gz file, if yes abort
  • Wait for the queue to get cleared
橙味迷妹 2024-10-14 05:19:12

您应该从 shell 脚本调用带参数的 PHP 脚本。这是如何在 PHP 中使用命令行参数的文档 http://php.net/manual /en/features.commandline.php

或者,我现在无法尝试,但您可以在处理 gzip 后给 unset($file) 一个机会。

for ($i = 1 ; $i >= 5; $i++)
{
    $file = gzfile($i.'.gz')
    ...gz content processing...
    unset($file);
}

You should call the PHP script with argument, from a shell script. Here's the doc how to use command-line parameters in PHP http://php.net/manual/en/features.commandline.php

Or, I can't try it now, but you may give a chance to unset($file) after processing the gzip.

for ($i = 1 ; $i >= 5; $i++)
{
    $file = gzfile($i.'.gz')
    ...gz content processing...
    unset($file);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文