У меня есть файл php для загрузки изображения (он загружает изображение, создает его миниатюру, а также добавляет водяной знак к изображению). Файл вызывается AJAX.
Он работал над моим локальным хостом в Windows XP с WAMPSERVER 2.0. Теперь я установил 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"; }
При отладке всего, что связано с AJAX, я бы рекомендовал следующее:
Убедитесь, что файл возвращает правильные данные без оболочки AJAX. Вызовите файл напрямую с помощью некоторых выборочных данных. Возвращает ли он то, что вам нужно? Имеет ли он синтаксические ошибки? Это первое, что вы хотите проверить, и это сэкономит вам массу головной боли.
Убедитесь, что ваш Javascript правильно разбирает данные. Ваш JS может ожидать JSON, но вы возвращаете XML, или ваши возвращенные данные не отформатированы так, как вы думаете, или вам может потребоваться оценить ваши возвращенные данные в Javascript, чтобы он действительно можно было использовать. Попробуйте выполнить команду console.log (), чтобы проверить, как выглядят ваши данные.
Попробуйте что-то вроде Postbin, которое позволяет отправлять данные POST. Убедитесь, что данные POST верны, и вы отправляете правильные данные в свой сценарий.
Для обычной отладки этого, вы должны разбить шаги вниз на функции и проверить каждую часть по очереди.
Что касается отладки Ajax, вы можете попробовать Zend_Log_Writer_FirePHP . Это расширение для Firebug, которое читает дополнительные данные в заголовках, отправленных PHP, а это значит, что данные в вашем теге ответа не содержат вывод отладки, а для таких вещей, как изображения, все еще можно отобразить.
После того, как вы установили FirePHP для Firebug, вы можете просто написать несколько строк:
$wFirebug = new Zend_Log_Writer_Firebug(); $firebug = new Zend_Log($wFirebug); $firebug->info($myArray); $firebug->info('Got to line 10');
Вы можете просто создать простую форму с вводом файла и просто использовать ее для простого тестирования.
Это самый простой способ, который я вижу, кто-то другой может иметь что-то лучшее в виду.
Я нахожу, что при работе с действием, вызываемым через AJAX в ZF, всегда полезно убедиться, что действие работает без AJAX. То есть, сделайте свою первую итерацию разработки результата функции, перейдя на новую страницу, чтобы представить действие, которое вы делаете.
Как только вы узнаете, что ваш PHP-код работает, вы можете начать беспокоиться о том, как работает AJAX. На мой взгляд, по крайней мере, возможность вывода Zend_Debug :: dump () для переменных при просмотре другой страницы намного проще для первоначальной разработки.
AJAX по дизайну создает слой непрозрачности, что может затруднить это. Это становится еще сложнее, если вы взаимодействуете, например, с плагином jQuery, который требует форматированных данных, которые по какой-то причине вы не получаете. Итак, сначала PHP, AJAX второй. Для ZF требуется примерно две секунды, чтобы перейти от PHP к вызову AJAX и наоборот.
Самое простое решение – использовать FirePHP ; установите firebug + firephp addon для firefox и включите классы в свой проект.
(Я храню библиотеку 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 и намного лучше, чем загрязнение вашего кода эхом и var_dumps при отладке ajax!
Сделайте запрос AJAX функцией обратного вызова, которая проверяет возвращаемые данные (echo'd) из функции PHP. Если данные echo'd – некоторая заранее определенная строка успеха («успех»?), Тогда все хорошо, если это не так, вывести функцию обратного вызова, которая выводится функцией в предупреждении или что-то в этом роде.