如何让我的服务器允许我的 PHP 脚本进程 运行 持续 75 分钟,而不是仅在 45 分钟后断开连接?

How can I make my server allow my PHP script process to run for 75 minutes instead of disconnecting after only 45 minutes?

我正在尝试通过 PHP 由 cron 作业启动的脚本从音频直播流中保存一个 mp4 文件。

预计可以工作 75 分钟,但问题是 运行 只工作了 45 分钟。我发现服务器可能会断开进程,不允许脚本运行这么长时间。

我从 CPanel 检查了我的 PHP ini 设置,我发现了这个:

allow_url_fopen 
 Enabled
display_errors      
 Disabled
enable_dl       
 Disabled
file_uploads    
 Enabled
max_execution_time      
30
max_input_time      
60
max_input_vars  
1000
memory_limit        
256M
post_max_size       
512M
session.gc_maxlifetime      
1440
session.save_path   
/var/cpanel/php/sessions/ea-php74
upload_max_filesize 
512M
zlib.output_compression     
 Disabled

这是我的 PHP 脚本:

<?php

function flush_buffers(){
    ob_end_flush();
    ob_flush();
    flush();
    ob_start();
}

$path = __DIR__ . '/save.mp4';

$stream = fopen( 'request url', "rb" );
$save = fopen($path, "w");
$startTime = time();
$finishTime = $startTime + (60*75);
while ( $finishTime >= time() ){

    $response = fread( $stream, 8192 ); 
    fwrite($save,$response);
    flush_buffers();
}

fclose( $stream );
fclose($save);
exit();

?>  

您可以尝试使用 ignore_user_abort() 函数和 set_time_limit() 函数。即使客户端断开连接,带有参数 trueignore_user_abort(true) 函数也会让脚本 运行。并将 set_time_limit(0) 函数的参数设置为零,使脚本永远 运行。

因此,将以下代码片段添加到脚本的顶部。这可以帮助你。

<?php

// Ignore user aborts and allow the script to run forever
ignore_user_abort(true);
set_time_limit(0);

问题是由于共享服务器托管限制。共享服务器不允许任何脚本 运行 超过 45 分钟(通常 VPS 和专用 运行)。

我通过 运行 2 个独立的 cron 作业(每个作业之间间隔 40 分钟)而不是一个大作业来解决这个问题。

  • 第一个作业创建一个文件并将数据保存到其中。
  • 第二个作业在剩余的流持续时间内将数据附加到同一文件。

为了避免服务器杀死脚本,每个脚本只运行 40 分钟。

这是我的最终代码:

<?php

// Ignore user aborts and allow the script to run forever
ignore_user_abort(true);
set_time_limit(0);

$path = __DIR__ . '/save.mp3';

$stream = fopen( 'my url', "rb" );
$save = fopen($path, "a");
$startTime = time();
$finishTime = $startTime + (60*40);
while ( $finishTime >= time() ){

    $response = fread( $stream, 8192 ); 
    fwrite($save,$response);
}

fclose( $stream );
fclose($save);
exit();

?>