php / apache2 - 简写if(bug - 讨论,找到解释)

时间:2013-11-05 13:48:29

标签: php linux performance apache virtual-machine

这是我无法解释的非常奇怪的事情,但可能你们中的一些人已经发现了同样或类似的问题?

想象一下以下伪PHP代码:

<?PHP

  mysql_connect("localhost", "mysql_user", "mysql_password");
  mysql_select_db("mydb");
  $result = mysql_query("SELECT id, my_name FROM my_table");

  while ($row = mysql_fetch_array($result, MYSQL_NUM)) {

      $row[1] ? echo $row[1] : echo $row[0];

  } 

  mysql_free_result($result);

?>

这基本上只是查询mySQL服务器并遍历所有记录集。 然后,它使用“简写”if语句来查明列my_name中是否存在某些内容。如果有,则会打印出来,否则会打印id

现在奇怪的部分,在Debian Linux虚拟机上,在ESX5上运行这个速记,如果比普通的if{}else{}语句长10倍。

因此,在我的情况下(迭代5000条记录)而不是3秒,这个特定的VM需要30秒 - ESX4 Debian主机上的相同代码运行正常。

如果我用正常的IF语句替换速记I​​F,一切都很好。

我在互联网上做了一些研究,但找不到解释。 你会从哪里开始寻找这个问题?

谢谢! // Markus

2 个答案:

答案 0 :(得分:1)

好吧,我的错 - 我应该阅读有关三元运算符的手册,然后再“使用它们”......

我将操作符更改为正确的格式,如评论中提到的非循环Tau MTilsted

$output .= ($row[1] ? $row[1] : $row[0]);

奇怪的速度问题已经消失 - 但接下来的问题是为什么PHP因为语法错误而没有抛出异常?

答案 1 :(得分:0)

我认为三元运算符(?)和IF语句(如此处所述http://fabien.potencier.org/article/48/the-php-ternary-operator-fast-or-not)之间存在一个有趣的区别,总和基本上是:

三元运算符的速度与复制语句结果所花费的时间直接相关,即使不是严格需要的也是如此。复制100000个元素的数组需要时间。

这是因为三元运算符将值复制到新的内存位置,而if..else块可能不会。

虽然这可以解释VM单个实例的速度差异,但它并没有充分解释为什么两个VM在使用三元运算符时速度不同。 假设您使用的两个VM位于不同的硬件上。您是否可能使用不同版本的PHP?底层处理器在两台主机之间是不同的,并且正在影响内存副本的处理速度吗?