PHP DateTime"失败"没有明显的理由 - PHP 7

时间:2018-01-29 09:28:58

标签: php apache yii php-7

我的一些php7服务器(windows)中有一种非常奇怪的行为。请跟我来,因为它真的很奇怪。

我有一些带有php 7.0.2和apache 2.4的Windows服务器,两者都配置正确。我运行一个名为Yii的php框架来渲染一个webapp。

随机间隔(有时是一天,有时是几天,有时只有几个小时),php的dateTime对象开始表现得像它不再是dateTime

当我使用$var = new DateTime();对其进行实例化时,它不会给出任何错误;但是,如果我对它应用任何与日期相关的方法,或者即使我尝试打印它,它也会出现类似这样的错误:

  

[2017年11月27日19:48:12欧洲/罗马] PHP Catchable致命错误:对象   8级无法转换为字符串   C:\ KRIA \ htdocs中\警予,1.1.18.018a89 \框架\ DB \架构\ CDbColumnSchema.php   第146行

唯一不断变化的是显示的ASCII码。

有罪的路线是:

switch($this->type)
    {
        -->case 'string': return (string)$value;
        case 'integer': return (integer)$value;
        case 'boolean': return (boolean)$value;
        case 'double':
        default: return $value;
    }

没什么特别的,只是演员。但它变得最糟糕:如果我放了print_r,我会得到混乱的ASCII值,但类型是Object,包含三个键:datetimezonetimezone_type。完全像日期对象。

但这真的搞砸了。如果我重新启动Apache服务,一切都恢复正常。

这让我疯了。我已经尝试了无数的东西,但似乎没有任何效果。

在指责Yii之前,我尝试实例化一个新的DateTime对象并同时执行echoprint_r,结果相同。

你们觉得怎么样?我在CentOS或Debian(我通常使用它)下从未遇到过这个问题。

它有可能是一个php版本的东西吗?

非常感谢

在BUG的新发生后编辑

好的,我(非)幸运地再次捕获这个bug。这次整个系统持续了5天而没有显示出这种行为。

我做了一些测试。我已经创建了最简单的php页面来测试它:

<?php
 $dt = new DateTime();
 echo $date->format('Y-m-d H:i:s');

这是按预期工作的。然后我添加了一个print_r($ dt),得到了:

Object ( [date] => 2018-02-02 16:14:30.000000 [timezone_type] => 3 [timezone] => Europe/Rome )

这与我的期望不同。我系统上的完全相同的代码产生了这个输出:

DateTime Object ( [date] => 2018-02-02 16:15:36.000000 [timezone_type] => 3 [timezone] => Europe/Rome )

这是我所期待的。似乎该对象不再被识别为DateTime obj。

现在,修改或格式化等功能可以工作,但将其转换为字符串(例如)会产生之前显示的错误。

此应用程序在Windows服务器计算机上运行,​​但数据库位于另一台计算机上,因此我可以通过不同的客户端连接到后者。 使用我自己的电脑(产生&#34;正确&#34; print_r),系统完美运行。在错误的一个上它没有用。

apache配置实际上是相同的。

但现在出现了非常奇怪的部分:在同一台机器上,经过优雅的apache重启后,运行相同的php代码可以让我得到正确的&#34;输出我的机器。

在我看来,有一些东西会发生变化&#34; DateTime类的背景代码以瞬态方式完全随机,因此当我重新启动apache时,我重置此更改,一切都恢复正常。

最后一点:我在第二次到最后一次出现此错误之前清楚地安装了apache和php,以避免任何文件损坏问题。

是否有可能存在一些外部因素或其他类似因素随机间隔使我?

非常感谢!

1 个答案:

答案 0 :(得分:0)

经过几个月的痛苦之后,我找到了一个解决方案,不至于下面的原因,而是至少可以解决这个问题。

问题是某种组成部分,隐藏在上帝所做的所有不同评论中,知道谁(它有点像一个混乱的组织)破坏了记忆。接下来你会得到错误,有时伴随着&#34; zend_heap内存已损坏&#34;有时没有。

在apache中启用mod_fcgi解决了这个问题。在日志之后,我了解到这样容器能够关闭任何有问题的php线程。

我希望这有助于其他人!