通过脚本运行持久任务.如何 aviod 错误没有 500


Running long-lasting task by script. How to aviod error no 500?

我有一个脚本,可以将产品从CSV文件导入网上商店。有~20.000个项目要导入,因此整个过程可能需要30-60分钟或更长时间。脚本可以由用户使用网络浏览器手动启动,也可以由CRON作业启动。在这两种情况下,我都想使用相同的脚本版本。新项目(或更新的当前项目)的导入将每周完成。

我的问题是服务器在工作~5分钟后杀死脚本。

我设置:

ini_set('max_execution_time' ,0);       
ini_set('set_memory_limit', -1)

意识到我只需要在一次运行中导入一堆项目,例如 500 个项目。在每次运行结束时,我将保存导入到数据库的状态 - 例如。项目 0-500 已导入,因此下次脚本应导入 500-1000。

我不知道我应该怎么做。导入一堆项目后我必须做什么?也许我应该在 GET 中使用状态参数进行重定向,例如:

header('Location: http://www.example.com/importer/import.php?package=4');
exit;

这是实现这一目标的好方法吗?这样的东西会适用于 cron 吗?

session_start();
// This function should take care of importing
// If $limit is null it should import whole csv file
function importProcess($offset, $limit = null) {
    // some magic here
}
echo "Importing process in progress...";
// Script is called from command line
if (php_sapi_name() === 'cli') {
    importProcess(0, null);
} else {
    $num = 500;
    $offset = isset($_SESSION['offset']) ? (int) $_SESSION['offset'] : 0;
    if (importProcess($offset, $num)) {
        $_SESSION['offset'] = $offset+$num;
        header('Location: http://www.example.com/importer/import.php');
    } else {
        echo "Done";
    }
}