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 语言环境。
目前我在服务器 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 语言环境。