繁体   English   中英

PHP在保存“大”文件时遇到问题

[英]PHP having issues saving “large” files

我有一个程序,该程序需要3个数组(长度相等,可以包含500个左右),并将它们写入文本文件。

但是我在写更大的文件时遇到了问题。 数组是画布绘图应用程序的坐标和时间戳,因此我可以控制长度。 我发现一旦文件开始大于2mb,它就不会保存文件。 我设法保存的最大文件大小为2.18mb。 从一个相关的问题PHP:上传大文件时遇到问题,我确定最可能的原因是将其托管在免费的托管服务器上。 我看过phpinfo(),这是4个相关的数字:

memory_limit 16M
max_execution_time 30
upload_max_filesize 5M
post_max_size 5M

这是相关的编写代码:

// retrieve data from the JS
$x_s = $_GET['x_coords'];
$y_s = $_GET['y_coords'];
$new_line = $_GET['new_lines'];
$times = $_GET['time_stamps'];

print_r($_GET);
$randInt = rand(1,1000);

// first want to open a file
$file_name = "test_logs/data_test_" . $randInt . ".txt";
$file_handler = fopen($file_name, 'w') or die("Couldn't connect");

// For loop to write the data
for ($i = 0; $i < count($x_s); $i++){
    // If new line want to write new line!
    if (!$new_line[$i]){
        if ($i!=0){
            // If not the first line
            fwrite($file_handler, "LINE_END\n"); }          
        fwrite($file_handler, "LINE_START\n");
    }

    // Write the x coord, y coord, timestamp
    fwrite($file_handler, $x_s[$i] . ", ". $y_s[$i] .", ". $times[$i]. "\n");

    // If last line then write last LINE_END
    if ($i == (count($x_s)-1)){
        fwrite($file_handler, "LINE_END\n"); }
}

fclose($file_handler);

我已经在本地主机上安装了php服务器,并可以访问错误日志。 这就是我得到的。

[Fri Mar 23 20:03:02 2012] [error] [client ::1] request failed: URI too long (longer than 8190)

解决的问题:问题是我正在使用GET发送大量数据,该数据已附加到URI。 URI达到8190个字符后,就会出现错误。 使用POST可解决此问题。

脚本可能超过了最大执行时间。

加上这个

set_time_limit(0)

在代码的开头。

upload_max_filesizepost_max_size确定可以发布的最大数据大小。 但这可能不是您的问题,因为已写入一些数据(如果达到数据限制,则脚本不会执行)。

您的脚本有两个限制: max_execution_timememory_limit 查看您的Apache错误日志文件,以查看是否收到错误消息(说明已达到限制)。

您也可以尝试在for循环中记录日志,以查看时间和内存使用量的进度:

if(($i % 100) == 0) { // log every 100 entries
  error_log(date("H:i:s ").memory_get_usage(true)."Bytes used\n", 3, 'test.log');
}

Suhosin补丁也可能阻止您发送太多数据点: http : //www.adityamooley.net/blogs/2012/01/09/php-suhosin-and-post-data/

1)检查max_input_time

ini_set ( 'max_input_time', 50 );

2)检入phpinfo()-您有Suhosin补丁程序吗?

您应该查看apache error_log-您应该找到达到的限制。

尝试

ini_set('error_reporting', E_ALL);
error_reporting(E_ALL);
ini_set('log_errors', true);
ini_set('html_errors', false);
ini_set('error_log', dirname(__FILE__).'script_error.log');
ini_set('display_errors', true);

PHP(因此是Web服务器)正在保护自己。 也许使用不同的机制来上传大文件-我想它们来自已知(可信)来源。 使用其他机制,例如SFTP。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM