如何让我的服务器允许我的 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()
函数。即使客户端断开连接,带有参数 true
的 ignore_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();
?>
我正在尝试通过 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()
函数。即使客户端断开连接,带有参数 true
的 ignore_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();
?>