【问题标题】:PHP : failed to open stream error using @fopenPHP:使用@fopen 无法打开流错误
【发布时间】:2016-05-06 22:15:18
【问题描述】:

我正在尝试将@fopen 与 PHP 一起使用。

在文件 A 中,我使用 @fopen 调用文件 B,它应该从数据库查询中向我发送一个 json 对象。

此查询返回大约 1 900 000 行。

如果在文件 BI 中停止,例如 1000000 行,一切正常,我可以在文件 A 中收到没有错误的 json 对象,但如果我让查询返回1 900 000 行 我收到了这条消息:fopen(the address): failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error

你有什么想法吗?

先谢谢你。

【问题讨论】:

  • 检查 Apache 的 error_log 和托管 B 脚本的服务器上的 PHP 错误日志。其中之一列出了错误的原因。我敢打赌它说:“致命错误:xxx 字节的允许内存大小已用尽(试图分配 yyy 字节)”
  • 也可能是服务器脚本超时错误。检查 apache 和 php 日志。您可能会在那里找到答案。
  • 我真的不认为,因为如果我直接请求文件 B,它就可以工作。仅当我使用 fopen 通过文件 A 转到文件 B 时才会出现问题
  • @axiac,也许 fopen 的上下文存在一个选项来执行此操作。我已经更改了“超时”,并且在文件 A 和 B 中,内存限制都设置为 2048M,这应该足够了吗?
  • 500 Internal Server Error 是远程服务器上的错误,很可能是 b 脚​​本中止。 fopen()b 脚本的运行方式影响很小。您可以尝试获取浏览器发送的确切 HTTP 请求(使用浏览器的开发人员工具获取),并使用 curl 而不是 fopen() 在 PHP 中复制它。也许你也可以使用fopen() 复制它,制作一个流上下文,我不知道;我从来没有这样做过。

标签: php sql-server json stream fopen


【解决方案1】:

好的,我已经找到了解决方案:

而不是通过 fopen 的流发送数据, 我将 json 对象存储在文本文件中,当我收到从文件 B 到 A 的进程结束确认时,在 A 中我使用生成的文件,然后删除它们。 使用此方法时要小心,如果 jour json 对象太大,您将无法在文件中插入内容,您必须将其拆分为多个部分。

感谢 @Monty@Axiac,他们帮助探索了不同的方式。

【讨论】:

  • 很高兴听到这个消息。乐于助人。
【解决方案2】:

实际上你正在跨越数组的限制。你必须设置限制 like :将您的 19 条缺失记录分为 2 部分。这意味着第一次 将创建新的 txt 文件并在其中写入 10 条缺失记录 第二次写入休息记录并从该文件中获取数据。

【讨论】:

  • 你认为json数组不能包含1900000行?
  • 我没有测试它。但它可能是
  • 哼,为什么不呢,我会试试的,但我读到了这个:stackoverflow.com/a/1262396/5778152 上面说没有限制
  • 我不同意这个答案。一切都有限制,取决于浏览器、服务器、操作系统、RAM 等等。
  • 我同意! :) 我正在尝试您的解决方案
猜你喜欢
  • 2013-04-25
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 2013-06-12
相关资源
最近更新 更多