Где я могу найти, какие функции PHP не поддерживают Windows?
Моя нормальная платформа разработки для PHP - это Linux. Я использую сервер Red Hat для своего сайта, моя компания использует красную шляпу и Fedora для производства, а у меня Ubuntu дома. Я не мог быть счастливее. К сожалению, теперь я должен потратить много времени на работу с PHP в Windows с помощью WAMP.
Я говорю, что это несчастливо, потому что я постоянно нахожу то, что Linux поддерживает то, что Windows не делает. В прошлом году это фактически затормозило проект, когда мы поняли, что WAMP использует более раннюю версию PHP (это было исправлено в порту от 5.3 до Windows). Сегодня я узнал, что checkdnsrr
не переносится в Windows, и вся библиотека pcntl
недоступна.
Итак, мои вопросы таковы: Есть ли где-нибудь, что говорит мне о текущих различиях между Windows и Linux в отношении PHP?
Я не ищу особенности, например, найденные в комментариях здесь (хотя это было бы хорошо), а скорее функции не будут доступны в Windows, которые доступны под Linux.
----------------------- EDIT ----------------------- -
Было два комментария/статусы, которые говорят, что checkdnsrr
существует в 5.3 под Windows. Технически это правильно. PHP не скажет, что функция не существует. Я не знаю, относится ли это ко всем установкам или просто WAMP, но в то время как да, он может сказать, что он работает, функция не работает так, как в Linux.
--------------------- UPDATE ----------------------
Не похоже, что есть хороший ответ на этот вопрос, но я нашел обходное решение благодаря одному из приведенных ниже предложений:
Поместите это в производственную среду. ПОМНИТЕ, ЧТОБЫ ПОЛУЧИТЬ НЕКОТОРЫЙ ФОРМ БЕЗОПАСНОСТИ НА ЭТО.
<?php print_r( get_defined_functions() ); ?>
Затем запустите это в среде dev. он выведет все функции, которые являются исключительными для локальной среды.
$root = file_get_contents( "<path to server>/available.php" );
$root = preg_replace( "/\[[0-9]{1,4}\]\s=>\s/", ( '' ), $root );
$tmp = '"internal" => array';
$root = explode( "\n", substr( $root, strpos( $root, $tmp ) + strlen( $tmp ) + 1 ) );
array_shift( $root );
array_shift( $root );
$internal = get_defined_functions();
$internal = $internal[ "internal" ];
function trim_array( array $root )
{
$nroot = array();
foreach( $root as $key=>$value )
{
$value = trim( $value );
if( !preg_match( "/^[a-zA-Z_]*[aeiouy]+[a-zA-Z0-9_]*$/", $value ) &&
!preg_match( "/^[a-zA-Z_]*(md5|crc|n12|str|sqrt|ch[a-z]?r|dl|tnt|ftp|png)[a-zA-Z_]*$/", $value ) )
{
//echo "\n $key ";
}
else
{
$nroot[] = $value;
}
}
return $nroot;
}
$root = trim_array( $root );
$internal = trim_array( $internal );
$diff = array_values( array_diff( $root, $internal ) );
foreach( $diff as $key => $fname )
{
if( in_array( $fname, $root ) )
{
echo "[$key] => $fname <= foreign server only";
}
else
{
echo "[$key] => $fname <= local";
}
echo "\n";
}
Ответы
Ответ 1
Я понятия не имею, существует ли такой сайт, как вы его просите, но вы можете использовать эти методы, чтобы узнать о установке PHP:
Несколько сложно сказать: это доступно в Windows, и это не на общем основании, поскольку часто функции зависят от версии PHP, и это может так же сильно повлиять на любую ОС.
Ответ 2
Во-первых, имейте в виду, что некоторые кросс-платформенные проблемы связаны не с отсутствием поддержки, а с особенностями, о которых вы говорите, самое худшее, что приходит мне в голову, - это направление косой черты каталога. Или проблема связана не с платформой, а с сервером. Например, у Apache есть переменные окружения, которые IIS не делает, хотя это будет похоже на вещи на уровне HTTP, а уровень TCP/IP будет OS-нейтральным.
В этой заметке:
- pcntl основан на модели процесса Unix, поэтому у нее не будет поддержки Windows.
- checkdnsrr поддерживается для Windows с 5.3, и существует пакет для добавления этого расширения в Windows раньше.
- На PHP.net есть список Расширения только для Windows (COM - тот, который бросается в глаза без проверки), но я предполагаю, что, поскольку PHP был разработан изначально для Unix (или, по крайней мере, POSIX), и поскольку 85% Интернета находится на Apache (я сделал это число вверх), их не так много, но вы правы что должен быть один.
Если бы это был я, я бы сходил с ума и сделал script, который очистил всю страницу списка расширений и систематически проверил ее на странице "Windows", чтобы получить представление о том, какие из них являются либо специальными, либо недоступными, Но это я, я сумасшедший.
О, и здесь быстрый список библиотек, которые PHP либо разрабатывает для Windows, либо никогда не будет развиваться:
http://wiki.php.net/internals/windows/libs
Ответ 3
Для каждой функции вызовите функцию_exists, например
function check_function(function_name)
{
function_exists(function_name) or die(function_name . " missing");
}
check_function("checkdnserr");