Как я могу гарантировать, что мой PHP переносим во всех серверных средах? - PullRequest
2 голосов
/ 03 декабря 2010

Это не редкость для меня, чтобы развернуть PHP на сервере или переместить его с одного сервера на другой, и он полностью потерпел неудачу с ошибками базы данных или cookie. Я бы хотел лучше избегать подобных проблем до того, как они возникнут.

Каковы некоторые потенциальные проблемы переносимости в PHP в отношении различных серверов, ОС и конфигураций PHP, и как их можно обойти? Предположим, что у меня (к сожалению) нет контроля над серверной средой, кроме FTP. (Я добавлю один ответ, чтобы начать работу)

Ответы [ 3 ]

1 голос
/ 03 декабря 2010

На самом деле, их слишком много, чтобы перечислять. Причина в том, что очень сложно написать полезное приложение, включающее только ядро ​​php (вообще без расширений). Поэтому, если вы хотите, чтобы он был очень переносимым, вам нужно иметь возможность использовать другие расширения (например, он должен иметь возможность использовать расширения PDO, MySQL и MySQLi, если вы используете базу данных MySQL).

В действительности существует множество зависимостей, которые вам необходимо проверить. Это не практично, чтобы перечислить их всех здесь (не в долгосрочной перспективе). Даже такие простые вещи, как включение путей, могут быть проблемой, если вы работаете в Windows или с включенным безопасным режимом. И это даже не принимает во внимание различные возможные настройки ini.

К счастью, есть достаточно простое решение. Используйте рамки. Большинство фреймворков имеют резервные методы и могут работать разными способами в зависимости от конфигурации сервера. Существует множество фреймворков, поэтому я не буду вдаваться в подробности, какие из них я бы порекомендовал. Используя уровень абстракции, они могут работать с несколькими различными возможными конфигурациями (другой пример - технология кэширования, с драйверами для APC, Eacellerator, MySQL, XCache, Memcache и т. Д.).

Единственное, что вы можете сделать, чтобы быть на 100% уверенным, это проверить. Я бы порекомендовал написать как можно больше тестов модулей, интеграции и функциональности. Такие инструменты, как PHPUnit и Selenium могут сильно помочь в этом.

Как только вы автоматизируете тестирование, я бы предложил использовать инструмент непрерывной интеграции (такой как Hudson ) для автоматизации тестирования на основе фиксации SVN. С его помощью вы можете настроить несколько целевых платформ для тестирования. Таким образом, вы можете запустить 10 или 15 различных виртуальных серверов и автоматически проверять каждый коммит на каждой конфигурации (Hudson поможет вам). Таким образом, вы мгновенно узнаете (ну, в любом случае, быстро), работает ли ваш код с каждым коммитом без необходимости делать что-либо еще с вашей стороны.

Это не простая проблема, чтобы решить. Но это разрешимо с небольшим усилием и некоторой изобретательностью.

Другая разумная вещь, которую вы можете сделать, это объявить минимальные требования и проверить их. Поэтому, если вам нужна поддержка MySQL, проверьте ее во время установки ... То же самое можно сделать с настройками INI ... Просто перечислите минимальную требуемую конфигурацию и проверьте ее. Таким образом, если кто-то придумает «неподдерживаемую платформу», вам не нужно беспокоиться, так как им сразу скажут, что это не сработает ...

Удачи ...

0 голосов
/ 03 декабря 2010

Магические кавычки, конечно, огромная проблема, но использование одного файла php.ini для всех ваших развертываний было бы хорошей идеей.Этот файл можно найти в / etc / php5 (или в любой другой версии PHP, которую вы используете).Это обеспечит одинаковую конфигурацию PHP на всех серверах (включая настройки магических кавычек).Также убедитесь, что вы также проверили с помощью функции phpinfo (), чтобы убедиться, что вы используете одну и ту же версию PHP на всех серверах.Также убедитесь, что при развертывании PHP на новом сервере у вас есть список всех установленных пакетов, таких как MCrypt, PEAR, библиотеки PECL, ImageMagick и т. Д.

0 голосов
/ 03 декабря 2010

Некоторые серверы настроены с включенными магическими кавычками (magic_quotes_gpc=1 в php.ini), что автоматически вызывает addslashes() для $_GET, $_POST, $_COOKIE и $_REQUEST.Первоначально он был введен, чтобы помочь новичкам неизвестным образом писать более безопасный код, но его использование теперь не рекомендуется.

Чтобы смоделировать отключение этого сбоя во время выполнения, если оно включено, запустите следующий код перед использованием любого из вариантов запроса (адаптированос этот комментарий ):

function destroyTheMagic($array, $topLevel = true) {
    $ret = array();
    foreach($array as $key => $value) {
        if(!$topLevel)
            $key = stripslashes($key);
        if(is_array($value))
            $ret[$key] = destroyTheMagic($value, false);
        else
            $ret[$key] = stripslashes($value);
    }
    return $ret;
}

if(get_magic_quotes_qpc()) {
    $_GET = destroyTheMagic($_GET);
    $_POST = destroyTheMagic($_POST);
    $_COOKIE = destroyTheMagic($_COOKIE);
    $_REQUEST = destroyTheMagic($_REQUEST);
}
...