Zend Framework 1.12 + Crontab + odbc query - Fatal error: Allowed memory size

Zend Framework 1.12 + Crontab + odbc query - Fatal error: Allowed memory size

目前我在服务器 Ubuntu 14.04.2 和 iSeries Access ODBC 驱动程序 64 位

中有一个在 Zend Zend Framework 1.12 上开发的应用程序

当我从控制器手动执行以下查询时,我正确地收到了结果:

class MaestrosController extends Zend_Controller_Action {

public function indexAction() {    
    $this->_query("SELECT OKCUNO AS VALUE, OKCUNM AS OPTION FROM OCUSMA WHERE OKCONO = 1");
}

private function _query($query) {             
    try {
        $conexion = $this->_connect();
        $result = odbc_exec($conexion, $query);
    }catch (Exception $e){
        die($e->getMessage());
    }
    $salida = array();
    while( ($row = odbc_fetch_array($result)) !== false ) {
        array_push($salida, $row);
    }
    $this->_disconect($conexion);
    return $salida;
}

private function _connect()
{
   $objConnect =  odbc_connect('EXPO', $this->odbc_user,$this->odbc_calve) or die('Connect: '.odbc_errormsg()."\n");
   return $objConnect;
}

private function _disconect($conexion)
{
   odbc_close($conexion);
}
}

但是,当我通过 contrab 执行它时:

php /var/www/vhosts/core.lan/application/cronjobs/cronjob.php >> /tmp/logcron.log

cronjob.php

define("_CRONJOB_",true);
require_once('/var/www/vhosts/core.lan/httpdocs/index.php');

(...)

$this->_query("SELECT OKCUNO AS VALUE, OKCUNM AS OPTION FROM OCUSMA WHERE OKCONO = 1");

(...)

出现以下错误信息:

Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 16815550472902410251 bytes) in /var/www/vhosts/core.lan/application/models/DbTable/M3.php on line 259. 

第259行对应$result = odbc_exec($conexion, $query);

为了通过cron执行,我的索引配置如下:

(...)

$application->bootstrap();

//Cronjobs don't need all the extra's so we don't execute the bootstrap
if(!defined('_CRONJOB_') || _CRONJOB_ == false){
    $application->bootstrap()->run();
}

日志中没有其他内容,none 错误消息除了内存大小。


寻找解决方案,我发现如果我通过 contrab 执行以下查询:

SELECT OKCUNO AS VALUE, OKCUNM AS OPTION FROM OCUSMA WHERE OKCONO = 1 FETCH FIRST 14 ROWS ONLY

完美运行:

+-----------+-------------------------------------+
| VALUE     | OPTION                              |
+-----------+-------------------------------------+
| 0000001   | ANIBAL                              |
| 0000002   | MODAS                               |
| 0000003   | NOVIAS                              |
| 0000004   | ROSA                                |
| 0000005   | RC                                  |
| 0000006   | BELLAESPOSA                         |
| 0000007   | RICARDO                             |
| 0000008   | YOLANDA                             |
| 0000009   | HUELVA .                            |
| 0000010   | DROP                                |
| 0000011   | DOBADOCA                            |
| 0000013   | MARIA                               |
| 0000014   | MODA                                |
| 0000015   | HABITUS                             |
+-----------+-------------------------------------+

然而,如果我执行以下命令,则会出现致命错误:

SELECT OKCUNO AS VALUE, OKCUNM AS OPTION FROM OCUSMA WHERE OKCONO = 1 FETCH FIRST 15 ROWS ONLY

如果我想查看该行中显示的信息,我执行 isql -v EXPO 并收到以下结果

+-----------+-------------------------------------+
| VALUE     | OPTION                              |
+-----------+-------------------------------------+
| 0000001   | ANIBAL                              |
| 0000002   | MODAS                               |
| 0000003   | NOVIAS                              |
| 0000004   | ROSA                                |
| 0000005   | JON                                 |
| 0000006   | BELLAESPOSA                         |
| 0000007   | CHARLES                             |
| 0000008   | YOLANDA                             |
| 0000009   | HUELVA                              |
| 0000010   | DROP                                |
| 0000011   | DOBADOCA                            |
| 0000013   | MARIA                               |
| 0000014   | MODA                                |
| 0000015   | HABITUS                             |
| 0000016   | Mª ANGELES                          |
+-----------+-------------------------------------+

我推断问题可能来自字符 ª


我在 IBM https://www-01.ibm.com/support/knowledgecenter/ssw_ibm_i_61/rzatv/rzatvlanguageodbc.htm 网站上阅读了以下文章:

ODBC Application Character Set

The ODBC application character set is defined by the current locale's character set.

$ locale return 以下内容:

LANG=es_ES.UTF-8
LANGUAGE=
LC_CTYPE="es_ES.UTF-8"
LC_NUMERIC="es_ES.UTF-8"
LC_TIME="es_ES.UTF-8"
LC_COLLATE="es_ES.UTF-8"
LC_MONETARY="es_ES.UTF-8"
LC_MESSAGES="es_ES.UTF-8"
LC_PAPER="es_ES.UTF-8"
LC_NAME="es_ES.UTF-8"
LC_ADDRESS="es_ES.UTF-8"
LC_TELEPHONE="es_ES.UTF-8"
LC_MEASUREMENT="es_ES.UTF-8"
LC_IDENTIFICATION="es_ES.UTF-8"
LC_ALL=

但是,命令 $ sudo /opt/ibm/iSeriesAccess/bin64/cwbnltbl 告诉我:

cwbnltbl - Download conversion table utility
Usage: cwbnltbl source-code-page target-code-page [host] [uid] [pwd]
Linux locale codeset=UTF-8 ccsid=1208

我不知道该怎么办。

我能找到的与我遇到的问题或多或少相似的唯一信息是 post:Linux odbc Fatal error: Allowed memory size,但是所提出的解决方案根本无法帮助我。

我恳请有人在这个问题上给我一些支持。

谢谢!

您可能 运行 遇到 this 旧 iSeries Access for Linux ODBC 驱动程序的问题。由于 unixODBC 2.2.13 中的 64 位 ABI 更改为支持 64 位参数,iSeries Access 7.1(及更早版本)驱动程序在与针对 unixODBC 2.2.13 或更新版本构建的应用程序一起使用时将产生不正确的结果。

解决方案是使用新的 IBM i Access ODBC 驱动程序,它是 IBM i Access Client Solutions - Linux Application Package 的一部分,已更新为使用新的 ABI。

问题与执行 php 脚本的环境区域相关。

运行 以下语句我可以修正它:

LANG = es_ES;

如果我 运行 通过 crontab 执行以下操作,我没有问题:

LANG = es_ES; php -f /var/www/vhosts/core.lan/application/cronjobs/cronjob.php >> /tmp/logcron.log

因此解决方案是修复 php 语言环境。