在运行php作为cli脚本时使用Zend_Db的问题

时间:2010-09-08 13:06:17

标签: zend-framework zend-db php

我正在尝试向Zend Framework项目添加一些管理脚本,最终将通过cron每晚运行。

然而,当我尝试使用Zend_Db时,我遇到了脚本的第一个问题。我目前正在进行一个非常简单的SQL调用来获取一些结果并使用 var_dump()显示它们但是我收到以下错误消息:

SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

到目前为止,该脚本如下所示:

<?php
chdir(dirname(__FILE__));

error_reporting(E_ALL|E_STRICT);
ini_set('display_errors', 1);
date_default_timezone_set('Europe/London');

//directory setup and class loading
set_include_path('.' . PATH_SEPARATOR . '../library/' . PATH_SEPARATOR . '../application/models/'
                    . PATH_SEPARATOR . '../library/MyApp/'
                    . PATH_SEPARATOR . get_include_path());

include "Zend/Loader/Autoloader.php";

$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);

//start sessions
Zend_Session::start(); 

//read configuration data
$config = new Zend_Config_Xml('../application/config/config.xml', 'app');

//we create an ability to capture errors and write them to an error log if there are problems.
$log = new Zend_Log();
$writer = new Zend_Log_Writer_Stream($config->log->logfile);
$log->addWriter($writer);
$filter = new Zend_Log_Filter_Priority((int)$config->log->level);
$log->addFilter($filter);

//we now need to get the list of graduates that need to have their CV's removed from the search engine
$date = new Zend_Date();
$date->sub(3, Zend_Date::MONTH);

echo $date->get(Zend_Date::ISO_8601);

$sql = "SELECT userid, guid FROM users WHERE lastlogin = ? AND active = 1";

$db = Zend_Db::factory($config->database);
try{

    $results = $db->fetchAll($sql, $date->get(Zend_Date::ISO_8601));

    var_dump($results);

}catch(Zend_Db_Exception $dbe){

    $log->debug($dbe->getMessage()."\n".$dbe->getTraceAsString());

}


//close database.
if($db->isConnected()){
    $db->closeConnection();
}

我错过了什么?我知道Zend_Config对象中的数据库连接设置有效,Web应用程序运行正常,没有任何问题。

我目前正在使用Zend Framework v1.7.6运行它。

还有在cli脚本中使用Zend Framework的任何通用技巧吗?

非常感谢。

2 个答案:

答案 0 :(得分:0)

PHP将尝试通过tcp / ip连接到mysql,除非mysql服务器与脚本在同一台机器上,并且“localhost”用作db主机。然后它将使用文件系统套接字。

可能是由于权限,mysql无法创建/tmp/mysql.sock,或者它没有配置为这样做。 The Mysql manual应该有更多内容。

现在快速解决这个问题的方法应该是将Zend_Db设置中的db主机更改为实际的ip mysql侦听,而不是“localhost”或“127.0.0.1”。

答案 1 :(得分:0)

还检查你的php.ini并寻找mysql_sock

对于安装了Mamp的Mac用户来说,这通常是一个陷阱:Snow Leopard附带一个php配置,与Mamp中包含的ph分开