如何调试AJAX调用的PHP文件?

时间:2009-10-25 12:34:10

标签: php zend-framework

我有一个用于上传图片的php文件(它上传图片,创建缩略图并为图片添加水印)。该文件由AJAX调用。

它正在使用WAMPSERVER 2.0在Windows XP上的本地主机上工作。现在我安装了Windows Vista,突然它无法正常工作(图片上传但缩略图和水印部分不起作用)。

我正在使用完全相同的软件来测试本地计算机上的应用程序(WAMPSERVER 2.0),但它不起作用。

如何调试此文件?这是它的外观:

<?php

define('BASE_PATH', substr(dirname(dirname(__FILE__)), 0, -22));

// set the include path
set_include_path(BASE_PATH
                 . '/../../library'
                 . PATH_SEPARATOR
                 . BASE_PATH
                 . '/library'
                 . PATH_SEPARATOR
                 . get_include_path());

// autoload classes from the library
function __autoload($class) {
    include str_replace('_', '/', $class) . '.php';
}

$configuration = new Zend_Config_Ini(BASE_PATH
                                     . '/application'
                                     . '/configs/application.ini',
                                     'development');
$dbAdapter = Zend_Db::factory($configuration->database);
Zend_Db_Table_Abstract::setDefaultAdapter($dbAdapter);

function _getTable($table)
{
    include BASE_PATH
    . '/application/modules/default/models/'
    . $table
    . '.php';
    return new $table();
}

$albums = _getTable('Albums');
$media = _getTable('Media');

if (false === empty($_FILES)) {

    $tempFile = $_FILES['Filedata']['tmp_name'];
    $extension = end(explode('.', $_FILES['Filedata']['name']));

    // insert temporary row into the database
    $data = array();
    $data['type'] = 'photo';
    $data['type2'] = 'public';
    $data['status'] = 'temporary';
    $data['user_id'] = $_REQUEST['user_id'];
    $paths = $media->add($data, $extension, $dbAdapter);

    // save the photo
    move_uploaded_file($tempFile,
                       BASE_PATH . '/public/' . $paths[0]);

    // create a thumbnail
    include BASE_PATH . '/library/My/PHPThumbnailer/ThumbLib.inc.php';
    $thumb = PhpThumbFactory::create('/' . $paths[0]);
    $thumb->adaptiveResize(85, 85);
    $thumb->save(BASE_PATH . '/public/' . $paths[1]);

    // add watermark to the bottom right corner
    $pathToFullImage = BASE_PATH . '/public/' . $paths[0];
    $size = getimagesize($pathToFullImage);
    switch ($extension) {
        case 'gif':
            $im = imagecreatefromgif($pathToFullImage);
            break;
        case 'jpg':
            $im = imagecreatefromjpeg($pathToFullImage);
            break;
        case 'png':
            $im = imagecreatefrompng($pathToFullImage);
            break;
    }
    if (false !== $im) {
        $white = imagecolorallocate($im, 255, 255, 255);
        $font = BASE_PATH . '/public/fonts/arial.ttf';
        imagefttext($im,
                    13, // font size
                    0, // angle
                    $size[0] - 132, // x axis (top left is [0, 0])
                    $size[1] - 13, // y axis
                    $white,
                    $font,
                    'HunnyHive.com');
        switch ($extension) {
            case 'gif':
                imagegif($im, $pathToFullImage);
                break;
            case 'jpg':
                imagejpeg($im, $pathToFullImage, 100);
                break;
            case 'png':
                imagepng($im, $pathToFullImage, 0);
                break;
        }
        imagedestroy($im);
    }

    echo "1";

}

6 个答案:

答案 0 :(得分:5)

对于一般的调试方法,你应该将步骤分解为函数并依次测试每个部分。

关于Ajax调试,您可能想试用Zend_Log_Writer_FirePHP。它是Firebug的扩展,它读取PHP发送的标头中的额外数据,这意味着响应主体中的数据不包含调试输出,对于像图像这样的东西,仍然可以呈现。

为Firebug安装FirePHP后,您只需编写以下几行:

$wFirebug = new Zend_Log_Writer_Firebug();

$firebug = new Zend_Log($wFirebug);

$firebug->info($myArray);

$firebug->info('Got to line 10');

答案 1 :(得分:2)

您可以使用文件输入创建一个简单的表单,只需使用它即可轻松进行测试。

这是我看到的最简单的方式,其他人可能会想到更好的东西。

答案 2 :(得分:2)

在调试与AJAX相关的任何内容时,我建议如下:

  • 确保文件返回正确的数据,而不包含任何AJAX包装器。使用一些示例数据直接调用文件。它会返回你需要的东西吗?它有语法错误吗?这是你想要检查的第一件事,它将为你节省大量的麻烦。

  • 确保您的Javascript正确解析数据。您的JS可能期望JSON但是您正在返回XML,或者您返回的数据没有按照您的想法进行格式化,或者您可能需要在Javascript中评估返回的数据以便实际使用它。尝试使用console.log()来测试数据的样子。

  • 尝试Postbin之类的内容,可以发送POST数据。确保您的POST数据正确,并且您正在向脚本发送正确的数据。

答案 3 :(得分:1)

我发现在使用ZF中通过AJAX调用的操作时,最好先确保操作而不使用 AJAX。也就是说,进行第一次开发特征结果的迭代,转到新页面来表示您正在进行的操作。

一旦你知道你的PHP代码有效,你就可以开始担心让AJAX工作了。在我看来,至少,当你查看另一个页面时能够在变量上输出Zend_Debug :: dump()对于初始开发来说要容易得多。

AJAX设计创建了一层不透明度,这使得很难做到这一点。如果你正在与一个需要格式化数据的jQuery插件进行接口,那就更加困难了。所以再次,PHP第一,AJAX第二。从ZF到AJAX调用,ZF大约需要两秒钟,反之亦然。

答案 4 :(得分:1)

最简单的解决方案是使用FirePHP;为firefox安装firebug + firephp插件,并在项目中包含类。

(我将FirePHP库保存在/ usr / share / php /中,以便我可以轻松地将其包含在任何项目中)

然后就这样做:

require_once('/path/to/FirePHPCore/FirePHP.class.php');
$fp = FirePHP::getInstance(true);
$fp->log('you can put anything here, vars, objects, arrays, etc');

它将在FireBug控制台中输出响应,并且比调试ajax时使用echos和var_dumps污染代码要好得多!

答案 5 :(得分:0)

使用回调函数发出AJAX请求,该函数检查从PHP函数返回的数据(echo'd)。如果数据echo'd是一些预先确定的成功字符串(“成功”?)那么一切都很好,如果不是这样,请回调函数输出函数在警报中输出的任何内容。