iconv_strlen函数导致MAMP上的执行超时问题

12

有人在运行MAMP时遇到了iconv_strlen函数的问题吗?


PHP中的字符串是如何存储的?使用\0还是带有长度? - alex
1
它们携带字节长度,但没有编码。iconv_strlen会在字符编码之间转换字符串,然后返回字符计数,而不是字节长度。 - Charles
@blacktie24,能否请您提供一个导致问题的示例字符串?您可以通过rawurlencode运行它后在此安全地发布,以确保我们获得实际的正确字节。(我已重新标记了您的帖子。) - Charles
@alex,关于什么?我相信你已经看过Joel的文章,这当然是我们这里必读的。还有这篇稍早但仍然很棒的PHP字符编码FAQ。关于PHP内部字符串表示的信息有点像部落知识;最近有人在这里分析了PHP源代码以证明长度是存储的。我会看看能否找到它。可能是Pascal Martin或Gordon。 - Charles
1
@alex,这就是我想到的答案。不幸的是,我记错了参考文献!十年前的手册评论并不具有权威性。 - Charles
显示剩余2条评论
4个回答

16

我正在使用Zend Framework网站,出现了超时问题,但没有抛出任何异常。通过深入跟踪调试器,我将问题追踪到iconv_strlen的使用上。它不是在任何奇怪的字符串上调用的,而是一个简单的函数被用于验证主机名。

为了验证这个问题,我尝试了一个简单的iconv_strlen("test", 'UTF-8'); 这导致错误出现 - 浏览器中无限旋转加载器但没有错误日志消息,并且脚本超过了最大执行时间。看起来这是这个版本PHP中未捕获的大bug。

我的同事找到了这篇文章,可能解决了这个问题。我使用最新的Snow Leopard更新了Mac OS X机器,即10.6。看起来这是一个已知的bug,如果你构建自己的php或使用内置的苹果版本或使用端口,则有一种解决方法。

长话短说,您可以深入重新编译自己的php并使用上述补丁,但这有点违背了MAMP的初衷。

最快的解决方案是根本不使用iconv_strlen()(或任何iconv_函数) - 如果使用Zend Framework,则这不是一个选项 - 或将MAMP还原为使用php 5.2。

除非MAMP开始包含PHP源文件并提供一种方法来轻松重新编译与所有必要库捆绑的PHP,否则这将必然成为该软件包的一个限制。MAMP在需要重新编译PHP时会存在问题。当出现这种情况时,最简单的方法是使用端口。


user673450,这正是我遇到的确切问题。感谢您提供可能的解决方法的信息。 - blacktie24
谢谢。太好了,我知道我没有疯掉。这在我使用Mamp Pro 2.0.1时仍然是个问题。 - Steve
感谢提供的信息。MAMP与PHP 5.2解决了我在MAMP 2和Magento(在Lion上)遇到的问题。 - Toby Hemmerling
3
MAMP 2.0.2终于解决了这个问题。http://blog-en.mamp.info/2011/08/mamp-pro-2-0-1-released.html - Zifius
1
@spankmaster79 是的,我在使用 PHP 5.3 上运行 Magento 的问题已经解决了。 - Zifius
显示剩余3条评论

1
如果还有人遇到这个问题,我也曾经苦苦挣扎过,但是在OSX Lion上升级到最新版本的MAMP Pro似乎对我有用。

我有Mamp Pro 2.0.1,但PHP5.3仍然无法正常工作。 - Steve
3
问题已在MAMP 2.0.2中修复。 - Zifius

0

wbond,你有点混淆了。MAMP 1.9.4 完全正常。问题出在从 1.9.5 到 2.0.1 版本的 MAMP 中包含了“iconv”问题。此外,我在 MAMP 2.0.1 中测试了你的解决方案,但在 PHP 5.3.6 中它不起作用。唯一的解决方案是回滚到 MAMP 1.9.4 或使用最新的 MAMP,但将 PHP 回滚到 5.2.x。

<?php 

$str = 'Hello, world!';
$str = iconv_function('UTF-8', 'UTF-8//IGNORE', $str);
echo $str;

function iconv_function ($in_charset, $out_charset, $str) {
  return iconv($in_charset, $out_charset, $str);
}

?>

0

升级从1.9版本到新版本还需要付费,简直是个笑话! - Dunhamzzz
没有人需要支付升级MAMP的费用。只有购买MAMP PRO才需要付费,而不是普通的MAMP,这一直是这样的。 - Giacomo1968

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接