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

时间:2011-08-03 09:15:15

标签: php apache postgresql select

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

SELECT id,command FROM tablet_sync WHERE id>$certainNumber

Id字段是 int4 类型;和命令是文本类型。

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

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

  • Apache呼叫永远不会结束。
  • 没有注意到错误消息(PHP / Apache日志文件,客户端和服务器)。

我应该告诉我,如果这个查询是在PostgreSQL客户端中执行的,那么就说pgAdmin,它运行得很好(当然,10000字节的数据不是大量的数据!)。 但是,如果我从我的PHP脚本中创建它,它就不起作用。

我向您提供了解决问题可能有用的所有其他信息:

  • 服务器和客户端具有相同的Apache和PHP版本:2.2和5.3.0;分别
  • 客户端和服务器不在同一台计算机上
  • 如果我在PHP脚本文件中执行查询时限制要恢复的数据量; 有效!。 (例如:SELECT id,( CAST命令AS varchar(9000) FROM tablet_sync WHERE id> $ certainNumber)

*的 更新 * 我可以认为PostgreSQL远程数据库服务器正在抛出这些错误:

  • 日志:无法从客户端接收数据:连接超时
  • 日志:客户端连接上的意外EOF

尽管有这些错误,PHP调用仍然没有结束......

* 04/08更新了 *

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

  1. 更改超时值无论如何都没有效果。

  2. 由于SHOW AL命令,我发现了一些配置字段 客户端和服务器端不同:所有语言环境(lc_collat​​e, lc_message等;); 在服务器端设置为UTF-8,同时在 客户端设置为English_United States.1252。的 max_fsm_pages 设定为153600;不到客户端。我发现postgreSQL版本在客户端和服务器端也是不同的:分别是8.3.1和8.3.9。 shared_buffer 值设置也不同:32MB和24MB;客户端和服务器。没有找到更多相关的差异。

  3. 我使用PHP API connector to PostgreSQL并且从现在起一直运作良好。 PHP错误日志文件没有显示任何内容。

1 个答案:

答案 0 :(得分:1)

这似乎是一个超时问题。

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

set statement_timeout to 10000;

这是以ms为单位的值,您也可以尝试将其设置为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连接器?此连接使用的optioinnal设置是什么(连接字符串,默认conf值,...)。 “SHOW ALL;”将列出每个设置,您应该尝试从PHP客户端执行此查询并将结果存储在某处,然后检查此列表中的每个设置,并使用pgadmin中的相同查询检查差异。 / p>