繁体   English   中英

没有明显原因的PHP DateTime“失败”-PHP 7

[英]PHP DateTime “Fails” with no apparent reason - PHP 7

我在一些php7服务器(Windows)中的行为异常诡异。 请关注我,因为它确实很奇怪。

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

以随机的间隔(有时是一天,有时是几天,有时甚至是几个小时),php的dateTime对象开始表现为不再是dateTime

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

[27 / Nov-2017 19:48:12欧洲/罗马] PHP可捕获的致命错误:无法将类8的对象转换为C:\\ KRIA \\ htdocs \\ yii-1.1.18.018a89 \\ framework \\ db \\ schema中的字符串\\ 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版本的东西?

非常感谢

在发生新的错误后进行编辑

好的,我很幸运再次遇到这个错误。 这次整个系统持续了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服务器计算机上运行,​​但DB在另一台服务器上,因此我能够通过不同的客户端连接到后者。 使用我自己的PC(产生“正确的” print_r),系统可以完美运行。 有故障的那是行不通的。

apache配置实际上是相同的。

但是现在出现了一个非常奇怪的部分:在同一台机器上,在正常重启apache之后,运行相同的php代码为我提供了在我的机器上获得的“正确”输出。

在我看来,有些东西以一种暂时的方式并且完全随机地“更改”了DateTime类的背景代码,因此当我重新启动apache时,我重置了此更改,一切恢复正常。

最后一点:在倒数第二次发生此错误之前,我已明确安装了apache和php,以避免任何文件损坏问题。

是否有某种外部因素或类似的因素会随机干扰我?

非常感谢!

经过几个月的痛苦,我找到了一个解决方案,至少不是针对根本原因,而是针对症状。

问题是某种成分,隐藏在上帝所做的所有不同评论中,知道谁破坏了内存(有点杂乱的组织)。 在此之后,您会得到错误,有时伴随着“ zend_heap内存损坏”,有时没有。

在apache中启用mod_fcgi可解决此问题。 根据日志,我了解到这种方式容器可以关闭任何有问题的php线程。

我希望这可以帮助其他人!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM