У меня есть проект, созданный с помощью Flash Builder 4, который использует Zend Framework для взаимодействия с PHP-скриптом, который взаимодействует с нашей базой данных MySQL. Человек, который все это нам устроил, ушел из компании, поэтому я должен попытаться во всем разобраться. Похоже, что папка Zend Framework находится по адресу / var / www / ZendFramework, и в этой папке есть папка «библиотека», а внутри - папка «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.
Я ни в коем случае не являюсь экспертом в подобных вещах, поэтому, пожалуйста, сделайте свой ответ как можно более тупым для меня :-)
Спасибо!
-Тревис
Я разобрался в проблеме. На самом деле это было что-то с файлом 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.