Где я могу найти, какие функции PHP не поддерживает Windows? - PullRequest
11 голосов
/ 29 января 2010

Моя нормальная платформа для разработки на PHP - Linux. Я использую сервер Red Hat для своего сайта, моя компания использует Red Hat и Fedora для производства, и у меня дома есть Ubuntu. Я не мог быть счастливее. К сожалению, теперь я должен уделять много времени работе на PHP в Windows, используя WAMP.

Я говорю, что это прискорбно, потому что я постоянно нахожу вещи, которые поддерживает Linux, а Windows - нет. В прошлом году он фактически задержал проект, когда мы поняли, что WAMP использовал более раннюю версию PHP (это было исправлено портом 5.3 для Windows). Сегодня я только что узнал, что checkdnsrr не портирован на Windows, и вся библиотека pcntl недоступна.

Итак, мои вопросы таковы: Есть ли где-нибудь, что говорит мне о текущих различиях между Windows и Linux относительно PHP?

Я не ищу идиосинкразии, такие как те, которые можно найти в комментариях здесь (хотя это было бы неплохо), но скорее, какие функции не будут доступны в Windows, которые доступны в Linux.

----------------------- РЕДАКТИРОВАТЬ ----------------------- -

Было два комментария / утверждения, в которых говорится, что checkdnsrr существует в 5.3 под Windows. Технически это правильно. PHP не скажет, что функция не существует. Я не знаю, так ли это для всех установок или только для WAMP, но, хотя да, можно сказать, что это работает, функция не работает, как в Linux.

--------------------- ОБНОВЛЕНИЕ ----------------------

Не похоже, что на этот вопрос можно найти хороший ответ, но я нашел обходной путь благодаря одному из следующих предложений:

Поместите это в производственную среду. ПОМНИТЕ, ЧТОБЫ ПРИНЯТЬ НЕКОТОРЫЕ ФОРМЫ БЕЗОПАСНОСТИ НА ЭТОМ.

 <?php print_r( get_defined_functions() ); ?>

Затем запустите это в среде разработчика. он выведет все функции, которые являются исключительными для локальной среды.

$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";
}

Ответы [ 3 ]

3 голосов
/ 29 января 2010

Во-первых, имейте в виду, что некоторые кроссплатформенные проблемы связаны не с отсутствием поддержки, а с упомянутыми вами особенностями. Самое худшее, что приходит мне в голову, это направление косой черты каталога. Или проблема не с платформой, а с сервером. Например, в Apache есть переменные окружения, которых нет в IIS, даже если кажется, что вещи на уровне HTTP и TCP / IP будут нейтральными для ОС.

На этой ноте:

  • pcntl основан на модели процессов Unix, поэтому он не будет поддерживать Windows.
  • checkdnsrr поддерживается для Windows начиная с 5.3, и пакет для добавления этого расширения в Windows уже существовал.
  • На PHP.net есть список расширений только для Windows (COM - это то, что прыгает в мою голову без проверки), но я предполагаю, что, поскольку PHP был изначально разработан для Unix (или в по крайней мере, POSIX), и поскольку 85% веб-сайтов на Apache (я придумал это число), их не так уж и много, но вы правы, что такой должен быть.

Если бы это был я, я бы сошел с ума и создал бы сценарий, который бы очищал всю страницу списка расширений и систематически проверял ее на начальной странице «Windows», чтобы понять, какие из них либо специальные, либо недоступные. Но это я, я сумасшедший.

О, а вот краткий список библиотек, которые PHP разрабатывает для Windows или никогда не собирается разрабатывать:

http://wiki.php.net/internals/windows/libs

2 голосов
/ 29 января 2010

Я понятия не имею, существует ли такой сайт, как вы просили, но вы можете использовать эти методы, чтобы узнать об установке PHP:

Сложно сказать: это доступно в Windows, и это не в общих чертах для многих функций зависит от версии PHP, и это может так же сильно повлиять на любую ОС.

0 голосов
/ 29 января 2010

Для каждой функции вызовите function_exists, например,

function check_function(function_name)
{
    function_exists(function_name) or die(function_name . " missing");
}

check_function("checkdnserr");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...