将CakePHP部署到PHP 5.4.16会在CakePHP的Core中产生非法的字符串偏移

时间:2014-06-03 13:56:23

标签: php cakephp php-5.3 php-5.4

我有一个PHP应用程序,它是在Ubuntu虚拟机上使用CakePHP 2.4.6开发的,其上安装了PHP 5.3.10-1ubuntu3.11(使用Apache2)。我的问题是我想将它部署到真正的服务器,它有PHP 5.4.16,我得到以下错误:

Warning (2): Illegal string offset 'session.cookie_lifetime' [CORE/Cake/Model/Datasource/CakeSession.php, line 482]
Warning (2): Illegal string offset 'session.name' [CORE/Cake/Model/Datasource/CakeSession.php, line 485]
Warning (2): Illegal string offset 'session.gc_maxlifetime' [CORE/Cake/Model/Datasource/CakeSession.php, line 491]
Warning (2): Illegal string offset 'session.cookie_httponly' [CORE/Cake/Model/Datasource/CakeSession.php, line 494]
Warning (2): Illegal string offset 'session.cookie_lifetime' [CORE/Cake/Model/Datasource/CakeSession.php, line 482]
Warning (2): Illegal string offset 'session.name' [CORE/Cake/Model/Datasource/CakeSession.php, line 485]
Warning (2): Illegal string offset 'session.gc_maxlifetime' [CORE/Cake/Model/Datasource/CakeSession.php, line 491]
Warning (2): Illegal string offset 'session.cookie_httponly' [CORE/Cake/Model/Datasource/CakeSession.php, line 494]
Warning (2): Illegal string offset 'session.cookie_lifetime' [CORE/Cake/Model/Datasource/CakeSession.php, line 482]
Warning (2): Illegal string offset 'session.name' [CORE/Cake/Model/Datasource/CakeSession.php, line 485]
Warning (2): Illegal string offset 'session.gc_maxlifetime' [CORE/Cake/Model/Datasource/CakeSession.php, line 491]
Warning (2): Illegal string offset 'session.cookie_httponly' [CORE/Cake/Model/Datasource/CakeSession.php, line 494]
Warning (2): Illegal string offset 'session.cookie_lifetime' [CORE/Cake/Model/Datasource/CakeSession.php, line 482]
Warning (2): Illegal string offset 'session.name' [CORE/Cake/Model/Datasource/CakeSession.php, line 485]
Warning (2): Illegal string offset 'session.gc_maxlifetime' [CORE/Cake/Model/Datasource/CakeSession.php, line 491]
Warning (2): Illegal string offset 'session.cookie_httponly' [CORE/Cake/Model/Datasource/CakeSession.php, line 494]

我已经读过这个错误,(如果我没弄错的话)这意味着你想要将一个字符串用作一个数组,但是它有一些与CakePHP核心有关的东西而不是我的PHP应用程序。

它向我的所有页面提供了这些错误(警告),并且未加载内容,因此我实际上只看到这些消息而没有任何css或html布局。

它在我的虚拟机上运行正常,所以我可以假设它必须对服务器上安装的较新版本的PHP做一些事情。

我还尝试使用较新版本的CakePHP,版本2.5.1,但它也导致了这些错误。

更新1:以下是CakeSession.php文件中的相关PHP代码段:

if (!isset($sessionConfig['ini']['session.cookie_lifetime'])) {
    $sessionConfig['ini']['session.cookie_lifetime'] = $sessionConfig['cookieTimeout'] * 60;
}
if (!isset($sessionConfig['ini']['session.name'])) {
    $sessionConfig['ini']['session.name'] = $sessionConfig['cookie'];
}

这些是变量,DebugKit显示:

$sessionConfig = array(
    'cookie' => 'CAKEPHP',
    'timeout' => '240',
    'ini' => 'C / 14400 CAKEPHP 14400 1',
    'defaults' => 'php',
    'cookieTimeout' => '240'
)
$defaults = array(
    'cookie' => 'CAKEPHP',
    'timeout' => (int) 240,
    'ini' => array(
            'session.use_trans_sid' => (int) 0,
            'session.cookie_path' => '/'
    )
)

更新2:我试图从Git中放一个干净的CakePHP(也有app文件夹)并且它可以工作。所以我的申请似乎有些问题......但我应该在哪里看?

有什么建议吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

我找到了问题的根源。我创建了一个配置页面,从j_config.php文件中读取配置详细信息。我还创建了Session变量,可在此配置页面上修改,但我没有意识到Configure :: read(' Session.ini')是一个数组,而不是一个字符串,我有只需将其放入输入字段,它就会自动转换为字符串。所以简而言之,因为我在Session中有这个数组到字符串:

array (
    'cookie' => 'CAKEPHP',
    'timeout' => 240,
    'ini' => 'C / 14400 CAKEPHP 14400 1',
    'defaults' => 'php',
    'cookieTimeout' => 240,
),

而不是:

array (
    'cookie' => 'CAKEPHP',
    'timeout' => 240,
    'ini' =>
    array (
      'session.use_trans_sid' => 0,
      'session.cookie_path' => '/',
      'session.cookie_lifetime' => 14400,
      'session.name' => 'CAKEPHP',
      'session.gc_maxlifetime' => 14400,
      'session.cookie_httponly' => 1,
    ),
    'defaults' => 'php',
    'cookieTimeout' => 240,
),

由于它在PHP 5.3中工作,它在PHP 5.4中不起作用,因为我将数组转换为字符串,我应该将它转换回数组(或更准确地说:使用我之前创建的数组中的字符串作为数组),它在PHP 5.4中提供此错误/警告。