Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
502坏网关:php://input_Php_Apache_Fopen - Fatal编程技术网

502坏网关:php://input

502坏网关:php://input,php,apache,fopen,Php,Apache,Fopen,在php文件中,我正在读取包含图像的输入流 $incomingData = file_get_contents('php://input'); $fh = fopen($uploadPath, 'w'); fwrite($fh, $incomingData); fclose($fh); 对于较小的图像,这很好,对于需要15秒以上的较大图像,我得到了502错误的网关响应 apache错误日志显示: 子pid 1492出口信号分段故障(11) 我试过这个,但没用 ini_set('default

在php文件中,我正在读取包含图像的输入流

$incomingData = file_get_contents('php://input');
$fh = fopen($uploadPath, 'w');
fwrite($fh, $incomingData);
fclose($fh);
对于较小的图像,这很好,对于需要15秒以上的较大图像,我得到了502错误的网关响应

apache错误日志显示:

子pid 1492出口信号分段故障(11)

我试过这个,但没用

 ini_set('default_socket_timeout', 120);
但我不确定这是否是一个暂停

编辑//代码:
$uploadFilename = time();
$uploadPath = '/path/melvin.jpg';

$fhSrc = fopen('php://input', 'r');

// Valid data?
if($fhSrc) {

    $fhDst = fopen($uploadPath, 'w');

    while (($data = fread($fhSrc, 1024)) !== FALSE) {
        fwrite($fhDst, $data);
    }

    fclose($fhSrc);
    fclose($fhDst);

}

echo 'ok';
原始标题:

POST /test.php HTTP/1.1
Host: hi.com
User-Agent: secret/1.0 (unknown, iPhone OS 5.0.1, iPhone, Scale/2.000000)
Accept: */*
Accept-Language: nl, en, fr, de, ja, it, es, pt, pt-PT, da, fi, nb, sv, ko, zh-Hans, zh-Hant, ru, pl, tr, uk, ar, hr, cs, el, he, ro, sk, th, id, ms, en-GB, ca, hu, vi, en-us;q=0.8
Accept-Encoding: gzip
Settings: {SOMEJSON}
Content-Type: application/x-www-form-urlencoded
Cookie: CAKEPHP=2b82f748fb3a64063b2e3be9bdec5c11
Connection: keep-alive
Transfer-Encoding: Chunked
Pragma: no-cache
Cache-Control: no-cache

and here in the boy the Big image

如果您遇到segfault,这里的问题与超时无关,与内存使用有关。一直以来,PHP处理*nix上OOM错误的方式都是segfault。如果您有一个需要15秒才能读取的文件,那么无论如何,您有一个非常大的文件,所以这并不奇怪

有几种方法可以解决这个问题。我建议的第一个是最简单的,不涉及任何配置。您可以将代码更改为此,它应该可以解决问题:

$fhSrc = fopen('php://input', 'r');
$fhDst = fopen($uploadPath, 'w');
stream_copy_to_stream($fhSrc, $fhDst);
fclose($fhSrc);
fclose($fhDst);
如果由于任何原因不可用或出现相同的错误,则快速而肮脏的替代方案是:

while (($data = fread($fhSrc, 1024)) !== FALSE) {
  fwrite($fhDst, $data);
}
这种方法避免了将整个文件数据读取到PHP的内存空间中,并将数据直接从web服务器缓冲区传输到磁盘-因为读取长度为
2048
PHP永远不需要超过2KB的工作内存来执行操作


或者,您可以更改php.ini中的指令。我不推荐这种方法,因为除其他原因外,它会降低代码的可移植性。

有帮助吗?请查看php错误日志。我认为您达到了内存限制,因为您将图像缓冲到字符串中。无论如何,一种更有效的方法是只
copy('php://input“,$目的地)否,max_input_time()或max_execution_time()@chris copy()也不起作用,但给出了完全相同的问题。还有其他解决办法吗?同时,当我试图阅读我的php错误日志时,我评论的要点是你需要检查php错误日志。通过()找到它的位置;您可能需要通过()将
error\u log
设置为该位置,将
log\u errors
设置为On,将
error reporting
设置为E\u来指定该位置。所有这两个选项都适用于较小的文件。但我总是在更大的文件中遇到同样的错误。该限制约为600.00/700.00KB。我将用现在的代码编辑我的第一篇文章。我希望你能帮助我。这绝对不是一个时间限制,我想一些PHP ini限制左右。但是找不到哪一条。我想你没办法改变收到的信息的格式了吧?如果可以的话,我很想知道您是否在
多部分/表单数据
文件上载和使用
$\u文件
数组时仍然遇到问题。。。syslog中是否有有用的东西(如操作系统日志文件)?我还注意到,您的消息的
内容类型为
application/x-www-form-urlencoded
,您说您将原始图像作为消息体发送-这没有语义意义,请求的
内容类型:
,应该是图像的类型,例如,
image/jpeg
将内容类型设置为image/jpeg有效。我现在可以发送大于1MB的数据。但这是一个奇怪的想法。为什么我会因此在directadmin中遇到分段错误?谢谢,顺便说一句,你救了我的命