PHP脚本执行SELECT查询的奇怪行为

PHP脚本执行SELECT查询的奇怪行为,php,apache,postgresql,select,Php,Apache,Postgresql,Select,我有一个长期运行良好的PHP脚本。它基本上执行对远程数据库的查询;使用postgreSQL API: SELECT id,command FROM tablet_sync WHERE id>$certainNumber Id字段是int4类型;命令是文本类型 正如我所说,它长期以来一直运作良好。但最近,我发现,命令字段有时可能有点大(但不是非常大);大约10000个字符或更多 那么,当该查询找到一行时,其字段命令大于一定数量的字符(约9000);它不起作用 Apache调用永远不会结束

我有一个长期运行良好的PHP脚本。它基本上执行对远程数据库的查询;使用postgreSQL API:

SELECT id,command FROM tablet_sync WHERE id>$certainNumber
Id字段是int4类型;命令是文本类型

正如我所说,它长期以来一直运作良好。但最近,我发现,命令字段有时可能有点大(但不是非常大);大约10000个字符或更多

那么,当该查询找到一行时,其字段命令大于一定数量的字符(约9000);它不起作用

  • Apache调用永远不会结束
  • 未发现任何错误消息(PHP/Apache日志文件、客户端和服务器)
我应该告诉你,如果这个查询是在PostgreSQL客户机上执行的,比如说pgAdmin,它工作得非常好(当然,10000字节的数据不是一个大数据量!)。 但是如果我使用PHP脚本,它就不起作用了

我将向您提供所有其他有助于解决问题的信息:

  • 服务器和客户端有相同的ApacheAdmPHP版本:2.2和5.3.0;分别
  • 客户端和服务器不在同一台计算机上
  • 如果在PHP脚本文件中执行查询时限制要恢复的数据量有效。(例如:选择id,(将命令转换为varchar(9000)来自tablet\u sync,其中id>$certainNumber)
*已更新* 我发现PostgreSQL远程数据库服务器抛出了以下错误:

  • 日志:无法从客户端接收数据:连接超时
  • 日志:客户端连接上出现意外的EOF
尽管有这些错误,PHP调用仍然没有结束

*2008年4月更新*

谢谢你的回答@regilero。我做了一些测试:

  • 更改超时值以任何方式都不起作用

  • 由于SHOW AL命令,我发现一些配置字段 客户端和服务器端不同:所有区域设置(lc\U collate, lc_message etc;;在服务器端的UTF-8中设置,同时在 客户端设置为English_United States.1252。max_fsm_pages 设置为153600;小于客户端。我发现客户端和服务器端的postgreSQL版本也不同:分别为8.3.1和8.3.9。shared_buffer值也不同:分别为32MB和24MB;客户端和服务器。未发现更多相关差异

  • 从现在起,我一直使用它,并且工作得很好。PHP错误日志文件没有显示任何内容

  • 这似乎是一个超时问题

    在postgresql会话端,您可以尝试在查询之前添加以下命令:

    set statement_timeout to 10000;
    
    它是一个毫秒的值,您也可以尝试将其设置为0(无限)

    如果来自会话中的tcp问题,您可以调整以下3个设置:

    set tcp_keepalives_count to 10;
    set tcp_keepalives_idle to 2;
    set tcp_keepalives_interval to 1;
    
    或其他值(这里只是一次随机尝试)。这里的意思是,尝试每2秒进行一次“tcp keepalive ping”,如果失败,则每1秒重试一次,并允许在死亡前重试10次(0表示系统默认)


    现在问题也可能出现在客户端,您使用哪个postgresql连接器?此连接使用哪些可选设置(连接字符串、默认配置值等)。A“
    全部显示;
    ”将列出每个设置,您应该尝试从PHP客户端执行此查询并将结果存储在某个位置,然后检查此列表中的每个设置,并与来自pgadmin的相同查询检查差异。

    如何执行查询?通过“PostgreSQL API”你是说pg_*函数吗?你也检查过MySQL错误日志了吗?很长一段时间……我是说Postgres,freudian slip,刚刚回答了一个MySQL问题。@bertzzie;是的,我正在使用pg_*函数,从现在起它们一直工作得很好。我也检查过PostgreSQL lof文件;没有发现任何错误。它只在我手动停止调用(在firefox上单击stop按钮)。我还应该告诉您,被调用的PHP脚本位于客户端计算机(localhost)中,但数据库位于远程服务器中。您可以尝试使用更新的PHP版本(可能是5.3.8)吗?我编辑了我的问题,附加了一些测试。谢谢你的回答!我不理解你编辑中的#2,show all不能显示客户端和服务器的差异,只是你从不同的客户端执行show all,不是吗(pgadmin是客户端,如同php API)?但是您正在请求两台不同的服务器吗?shared_buffer是一种服务器设置,您无法从不同的客户端获取该配置的两个值。Ups,对不起,我没有告诉您系统有两台服务器(一台是同一台机器上的客户端和服务器,另一台是远程服务器)。原因是有时客户端必须在没有Internet连接的情况下工作;因此它将信息存储在本地数据库中,然后尝试与远程服务器同步。因此..是的…我从同一客户端(pgAdmin)更改了“全部显示”格式到不同的服务器:/。所以你告诉我从pgAdmin客户端和PHP API客户端到同一个远程服务器执行'SHOW ALL'命令;并检查差异?谢谢。