array_map导致服务器崩溃

4

以下代码导致我的Apache Web服务器崩溃。当我从parse_service_rows()中移除数据库查询时,Apache就不会崩溃。

我还尝试了从查询中删除WHERE子句,但没有帮助。

我的代码看起来像这样:

public function tab($tab_name = '') {
    /*
     * CODE TO GET ROWS
     */
    $service['rows'] = array_map(array($this, 'parse_service_rows'), $service['rows']);
}

private function parse_service_rows($row) {

    // This query causes apache to crash
    $order = $this->db->get_where('services', array(
            'service_user_id' => $this->user->get('user_id'),
            'service_firm_id' => $this->firm->id,
            'service_type' => $row['type'],
            'service_object_id' => $row['object_id']
    ), 1)->row_array();

    return $row;
}

然而,当我尝试使用foreach替换array_map时,它起作用了:

foreach ($service['rows'] as $key => $row) {
    $service['rows'][$key] = $this->parse_service_rows($row);
}

Windows错误窗口提供了以下信息:

Problem Event Name: APPCRASH
  Application Name: httpd.exe
  Application Version:  2.4.2.0
  Application Timestamp:    4fafa3e6
  Fault Module Name:    php5ts.dll
  Fault Module Version: 5.4.4.0
  Fault Module Timestamp:   4fd8f85c
  Exception Code:   c0000005
  Exception Offset: 000713cd
  OS Version:   6.1.7600.2.0.0.256.1
  Locale ID:    1061
  Additional Information 1: 0a9e
  Additional Information 2: 0a9e372d3b4ad19135b953a78882e789
  Additional Information 3: 0a9e
  Additional Information 4: 0a9e372d3b4ad19135b953a78882e789

为什么会发生这种情况?

我建议的第一条建议是确保您使用的是最新版本的PHP。崩溃消息显示您正在使用5.4.4版本。尝试升级到最新版本(5.4.10);可能存在已修复的已知错误。如果这样做无法解决问题,您可能需要向PHP开发人员报告崩溃情况。在这种情况下,创建一个演示问题的最小代码测试案例将有助于解决问题。 - SDC
2个回答

1
你应该检查你的IIS PHP错误日志,你可以通过IIS管理PHP配置找到它并在那里阅读。
确保你的PHP日志级别至少为E_ALL,并且打开了error_reporting,如果这是一个dev服务器,你应该也打开display_errors。这些都是你的PHP.ini中的选项,你也可以从你的IIS管理控制台编辑它们。
如果这没有帮助,这里有一些你应该看看的地方:
在查询之前调用$this->user->get('user_id')并将结果设置为变量的实例。这将显示用户类是否被实例化,以及用户类中的get函数作用域是否有问题。
还要在get_where之外调用$this->firm->id,id可能不是公共属性,这也会导致PHP致命错误。

0
@Kristian 你尝试过在tab()之前声明parse_service_rows()吗?我记得在某个地方读到过,如果回调函数在调用函数之后声明,可能会出现问题。

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