2010-01-28 37 views
11

Nền tảng phát triển bình thường của tôi cho PHP là Linux. Tôi sử dụng máy chủ mũ đỏ cho trang web của mình, công ty của tôi sử dụng mũ đỏ và Fedora để sản xuất và tôi có Ubuntu ở nhà. Tôi không thể hạnh phúc hơn. Thật không may, bây giờ tôi cần phải dành nhiều thời gian làm việc trong PHP trong Windows bằng cách sử dụng WAMP.Tôi có thể tìm thấy những chức năng PHP nào Windows không hỗ trợ?

Tôi nói điều này thật không may vì tôi liên tục tìm kiếm những thứ mà Linux hỗ trợ mà Windows không hỗ trợ. Năm ngoái, nó thực sự trì hoãn một dự án khi chúng tôi nhận ra rằng WAMP đã sử dụng một phiên bản PHP cũ hơn (điều này đã được cố định bởi cổng 5.3 đến Windows). Hôm nay, tôi chỉ biết rằng checkdnsrr không được chuyển sang Windows và toàn bộ thư viện pcntl không khả dụng.

Vì vậy, câu hỏi của tôi là: Có bất kỳ nơi nào cho tôi biết sự khác biệt hiện tại giữa Windows và Linux liên quan đến PHP không?

Tôi không tìm kiếm idiosyncrasies, như được tìm thấy trong các ý kiến ​​here (mặc dù những người sẽ được tốt đẹp), nhưng thay vào đó chức năng sẽ không có sẵn trong Windows có sẵn trong Linux.

----------------------- EDIT ---------------------- ---

Đã có hai nhận xét/số liệu cho biết rằng checkdnsrr tồn tại trong 5.3 dưới Windows. Về mặt kỹ thuật, điều này là chính xác. PHP sẽ không nói rằng hàm không tồn tại. Tôi không biết nếu đây là trường hợp với tất cả các cài đặt hoặc chỉ WAMP, nhưng trong khi có, nó có thể nói rằng nó hoạt động, chức năng không hoạt động như trong Linux.

--------------------- CẬP NHẬT ----------------------

Có vẻ như không có câu trả lời hay cho câu hỏi này, nhưng tôi đã tìm thấy giải pháp thay thế nhờ một trong các đề xuất bên dưới:

Đặt điều này vào môi trường sản xuất. HÃY NHỚ LẠI MỘT SỐ MẪU BẢO MẬT VỀ NÀY.

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

Sau đó chạy trên môi trường dev. nó sẽ xuất tất cả các hàm độc quyền cho môi trường cục bộ.

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

(* sidenote *) 'checkdnsrr' có sẵn trên Windows như của PHP5.3 – Gordon

Trả lời

2

Tôi không có ý tưởng nếu một trang web như bạn yêu cầu tồn tại, nhưng bạn có thể sử dụng các phương pháp này để tìm hiểu về một cài đặt PHP:

Hơi khó để nói: tính năng này có sẵn trên Windows và đây không phải là cơ sở chung cho các chức năng thường phụ thuộc vào phiên bản PHP và điều này có thể ảnh hưởng nhiều đến bất kỳ hệ điều hành nào.

+0

Có 'get_loaded_extensions' trả về cùng một thứ như phpinfo() , hoặc nó bao gồm các phần mở rộng cốt lõi mà không yêu cầu thay đổi cho tập tin cấu hình? – Anthony

+0

Trong khi điều này không * kỹ thuật * trả lời câu hỏi, nó có điều gần nhất có thể. – cwallenpoole

3

Đầu tiên, hãy nhớ rằng một số vấn đề nền tảng không phải do thiếu sự hỗ trợ nhưng idiosyncrasies bạn đề cập, điều tồi tệ nhất mà nói đến cái tâm của tôi là sự chỉ đạo của slash thư mục. Hoặc vấn đề không phải là với nền tảng nhưng với máy chủ. Ví dụ, Apache có các biến môi trường mà IIS không mặc dù nó có vẻ như mọi thứ ở cấp HTTP và mức TCP/IP sẽ là trung lập của OS.

Ngày lưu ý rằng:

  • pcntl được dựa trên mô hình quy trình Unix, vì vậy nó sẽ không có hỗ trợ Windows.
  • checkdnsrr được hỗ trợ cho Windows là 5.3 và gói tồn tại để thêm tiện ích đó vào Windows trước đây.
  • Có một danh sách trên PHP.net của Windows-only extensions (COM là một trong những bước nhảy mà không kiểm tra), nhưng tôi đoán là vì PHP được thiết kế ban đầu cho Unix (hoặc ít nhất POSIX) và từ 85% web là trên Apache (tôi đã thực hiện con số đó lên), họ không phải là nhiều của một phản đối kịch liệt, mặc dù bạn đang phải rằng cần có một.

Nếu đó là tôi, tôi sẽ phát điên và tạo một tập lệnh để cạo toàn bộ trang danh sách mở rộng và có hệ thống kiểm tra trang giới thiệu cho "Windows" để biết ý tưởng nào là đặc biệt hoặc không có sẵn. Nhưng đó là tôi, tôi là zany.

Oh, và đây là một danh sách những thư viện PHP là một trong hai phát triển cho Windows hoặc là không bao giờ phát triển:

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

+0

Tôi cho rằng, nếu bạn nhìn vào giải pháp được đăng ở trên, đó là nhiều hơn hoặc ít hơn những gì tôi đã làm. Tôi vừa kết hợp câu trả lời của Gordon với ý tưởng đó. – cwallenpoole

0

Đối với mỗi chức năng, gọi function_exists, ví dụ

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

check_function("checkdnserr"); 
+0

Và làm điều này cho mỗi chức năng duy nhất? Đó không phải là thanh lịch khủng khiếp. Ngoài ra, gọi die() có nghĩa là nếu hàm không tồn tại (và nó nằm trong một loạt các hàm không tồn tại), thì sẽ không có phản hồi về tất cả các hàm khác. – cwallenpoole

+0

Đồng ý, về cả hai tính; đây là một ví dụ đơn giản về cách xử lý vấn đề. Mặt khác, tôi nghi ngờ rằng chỉ có một tập hợp con nhỏ các hàm có vấn đề, vì vậy không cần phải làm điều này cho tất cả các hàm một cuộc gọi (mặc dù nếu cần thiết, có thể không gặp nhiều rắc rối khi tạo một tiện ích sẽ phân tích cú pháp PHP và tự động tạo một tập lệnh mới gọi hàm funcion_exist cho mỗi hàm được gọi. Trong thực tế, tôi đã tìm thấy cách tiếp cận ở trên để làm việc, mặc dù các kịch bản lệnh PHP của tôi thường không đòi hỏi nhiều lắm. –

Các vấn đề liên quan