Zend не отправляет ответ обратно во Flash
У меня есть проект, созданный с помощью Flash Builder 4, который использует Zend Framework для взаимодействия со скриптом PHP, который взаимодействует с нашей базой данных MySQL. Человек, который все это нам устроил, покинул компанию, поэтому я должен попытаться это выяснить. Похоже, что папка Zend Framework находится по адресу /var/www/ZendFramework, и в этой папке есть папка "library", а внутри это папка "Zend".
Файл amf_config.ini в корневой папке моего приложения по адресу /var/www/html/cc/ControlCenterX.XX.XXXXXX содержит следующее содержимое:
[zend]
webroot = ./
zend_path = /var/www/ZendFramework/library
[zendamf]
amf.production = false
amf.directories[]=./
и у gateway.php есть это содержимое, которое я предполагаю по умолчанию:
<?php
ini_set("display_errors", 1);
$dir = dirname(__FILE__);
$webroot = $_SERVER['DOCUMENT_ROOT'];
$configfile = "$dir/amf_config.ini";
//default zend install directory
$zenddir = $webroot. '/ZendFramework/library';
//Load ini file and locate zend directory
if(file_exists($configfile)) {
$arr=parse_ini_file($configfile,true);
if(isset($arr['zend']['webroot'])){
$webroot = $arr['zend']['webroot'];
$zenddir = $webroot. '/ZendFramework/library';
}
if(isset($arr['zend']['zend_path'])){
$zenddir = $arr['zend']['zend_path'];
}
}
// Setup include path
//add zend directory to include path
set_include_path(get_include_path().PATH_SEPARATOR.$zenddir);
// Initialize Zend Framework loader
require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();
// Load configuration
$default_config = new Zend_Config(array("production" => false), true);
$default_config->merge(new Zend_Config_Ini($configfile, 'zendamf'));
$default_config->setReadOnly();
$amf = $default_config->amf;
// Store configuration in the registry
Zend_Registry::set("amf-config", $amf);
// Initialize AMF Server
$server = new Zend_Amf_Server();
$server->setProduction($amf->production);
if(isset($amf->directories)) {
$dirs = $amf->directories->toArray();
foreach($dirs as $dir) {
// get the first character of the path.
// If it does not start with slash then it implies that the path is relative to webroot. Else it will be treated as absolute path
$length = strlen($dir);
$firstChar = $dir;
if($length >= 1)
$firstChar = $dir[0];
if($firstChar != "/"){
// if the directory is ./ path then we add the webroot only.
if($dir == "./"){
$server->addDirectory($webroot);
}else{
$tempPath = $webroot . "/" . $dir;
$server->addDirectory($tempPath);
}
}else{
$server->addDirectory($dir);
}
}
}
// Initialize introspector for non-production
if(!$amf->production) {
$server->setClass('Zend_Amf_Adobe_Introspector', '', array("config" => $default_config, "server" => $server));
$server->setClass('Zend_Amf_Adobe_DbInspector', '', array("config" => $default_config, "server" => $server));
}
// Handle request
echo $server->handle();
Это приложение отлично работает на нашем локальном сервере.
Сейчас мы переносим все на сторонний облачный сервер. Этот облачный сервер имеет несколько виртуальных хостов, по одному для каждого из наших локальных серверов, которые мы переносим. Я установил Zend Framework, выполнив apt-get install zend-framework
, Похоже, по умолчанию он устанавливается в /usr/share/php/libzend-framework-php. Я пытался изменить zend_path
в amf_config.ini к этому расположению, но я получаю сообщение об ошибке "Канал отключен до получения подтверждения". Я попытался скопировать папку ZendFramework с локального сервера в /var/www/ControlCenter на облачном сервере, который является новым корнем документа для этого виртуального хоста, а затем изменил zend_path
в amf_config.ini в "/var/www/ControlCenter/ZendFramework/library", но я получаю точно такой же результат.
Мое приложение Flash находится по адресу /var/www/ControlCenter/ControlCenterX.XX.XXXXXX, который также является папкой, содержащей amf_config.ini, gateway.php и мой PHP-скрипт.
Похоже, что функция PHP вызывается просто отлично. Для проверки у меня была функция создания текстового файла. Когда приложение Flash вызывает функцию PHP, создается текстовый файл, поэтому вызывается функция, но, похоже, существует проблема с отправкой данных обратно в приложение Flash.
Я ни в коем случае не эксперт в подобных вещах, поэтому, пожалуйста, сделайте как можно дольше свой ответ:-)
Спасибо!
-Travis
1 ответ
Я понял проблему. На самом деле это было что-то с файлом PHP, а не проблема конфигурации. Мой PHP-файл имеет следующую структуру:
<?php
class FLASH
{
public static function testFunction($param1, $param2)
{
// do stuff
return $value;
}
}
if ($_GET["function"])
{
switch($_GET["function"])
{
case "testFunction":
$result = FLASH::testFunction($_GET["param1"], $_GET["param2"]);
echo $result;
break;
}
}
?>
Таким образом, я могу легко протестировать функцию PHP в браузере, вызвав " http://my-url.com/FLASH.php?function=testFunction¶m1=value1¶m2=value2". На моем локальном сервере это работало без проблем, но по какой-то причине новому серверу не понравилась область тестирования в этом файле. Он продолжал говорить, что "функция" не определена или что-то, говоря о if ($_GET["function"])
часть. Поэтому я взял тестовую часть и поместил ее во вторичный файл, назвал его testFLASH.php и включил в него FLASH.php через require_once("FLASH.php");
и теперь я могу проверить функции, вызвав testFLASH.php в браузере вместо FLASH.php.