gpt4 book ai didi

php - Apache/PHP/FreeTDS 的特殊字符结果不一致,但命令行中的 PHP/FreeTDS 不一致

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:47:50 25 4
gpt4 key购买 nike

我有两台相同的服务器(称为测试和生产),Linux Red Hat Enterprise Linux Server 6.2 版(圣地亚哥)、PHP 5.4.2 版、Apache Apache 2.4.2、OpenSSL/0.9.8s、freeTDS 0.92-dev (不是最好的,但我暂时无法更改),以及带有 Microsoft SQL Server 的单独 Windows 服务器。

我有一个名为 testfs1.php 的 PHP 脚本,它从数据库中读取一个始终相同的字符串,并打印出长度:仅此而已。当然,最初的情况要复杂得多,但我尽力简化了。

数据库字段为NVARCHAR,所有组件都设置为使用UTF-8。

通常一切正常:脚本显示预期的字符串长度。但是,每隔几个小时甚至几天,仅在生产服务器(托管几个使用频繁的应用程序)上,错误就会“激活”:Web 服务器开始显示从数据库中错误提取的特殊字符。有时,错误会在几分钟后自行“停用”;上次,持续了几个小时,然后我跑了

service httpd restart

并且错误已停用。

在bug活跃的时间范围内,它是一致的:对页面testfs1.php的web服务器的所有请求都显示错误的结果;然而,当我手动运行时

php testfs1.php

在服务器的命令行上,错误永远不会出现,即使它处于事件状态也是如此。

这是我日以继夜运行的 Bash 脚本,用于监控漏洞的激活情况:

#!/bin/bash

while : ; do
echo -n `date +%H%M%S`
wget https://www.mydomain.org/testfs1.php -o /dev/null
echo -n "("
cat testfs1.php
echo -n ") "
rm testfs1.php
sleep 2
done

我用来重现问题的 PHP 脚本:

<?php
$Conn = mssql_connect( 'PROD', 'user', 'password' ) ;
mssql_select_db( "DBPROD", $Conn ) ;
$Ret = mssql_query( "SELECT lname FROM people WHERE people_key=123", $Conn ) ;
list( $s ) = mssql_fetch_row( $Ret ) ;
print strlen( $s ) ;

?>

这是 freeTDS 使用的 locales.conf:

[default]
date format = %b %e %Y %I:%M:%S:%z%p
language = us_english
charset = UTF-8

[en_US]
date format = %b %e %Y %I:%M:%S:%z%p
language = us_english
charset = UTF-8

[es_ES]
date format = %b %e %Y %I:%M:%S:%z%p
language = us_english
charset = UTF-8

[pt_BR]
date format = %b %e %Y %I:%M:%S:%z%p
language = us_english
charset = UTF-8

[it_IT]
date format = %b %e %Y %I:%M:%S:%z%p
language = us_english
charset = UTF-8

这个问题最令人费解的特殊性的总结:

  1. 当从命令行使用 PHP 运行脚本时,错误永远不会发生,只会从 Apache 运行
  2. 错误在不同时刻“激活”,每隔几个小时或几天一次,然后自行“停用”或通过“服务 httpd 重启”
  3. 在 freeTDS 使用的 locales.conf 中,[default]/charset 行缺失时,错误会更频繁地自发激活和停用(每隔几秒)
  4. 当同一台服务器上的另一个应用程序使用 gettext 时,错误会更频繁地自发激活和停用(每隔几秒)

一位同事暗示这可能是内存问题,考虑到重新启动 Apache 可以释放内存,这在一定程度上是有道理的,并解释了为什么它不会发生在流量最小的测试服务器上。我不相信。

您能想象这种情况的可能原因和解决方案吗?

最佳答案

坦率地说,我不知道是什么导致了这种不一致的工作。但我想建议您将 FreeTDS 和 unixODBC 更改为稳定版本。由于 FreeTDS 缺乏文档和支持。我一直在使用 v0.82。它工作正常。

https://gitorious.org/freetds/mars-freetds/source/52e59affc0110c5ddd379ef1e45c4554123f27b5:README#L2

另一种详细查找问题的方法是在 testfs1.php 中使用 PDO MsSQL。通过这种方式,如果 native mssql 扩展对这种不一致有任何影响,您可以更好地解决问题。

关于php - Apache/PHP/FreeTDS 的特殊字符结果不一致,但命令行中的 PHP/FreeTDS 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20492093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com