2009-05-14 29 views
55

có ai đó biết cách có số nguyên 64 bit trên PHP không? nó có vẻ như nó không phải là bằng tập tin cấu hình mà là nó có thể là một lựa chọn thời gian biên dịch và nó phụ thuộc vào nền tảng?làm thế nào để có số nguyên 64 bit trên PHP?

+1

tôi đang tìm kiếm thêm "số nguyên là giải pháp 64 bit", do đó, không muốn sử dụng mô-đun cho số nguyên lớn. –

+1

Lưu ý phụ: Tôi đã tìm thấy một số tệp nhị phân PHP 64 bit tại: http://tommymontgomery.com/php64 –

+0

có thể trùng lặp [các đặc điểm thiết lập PHP sao cho các số nguyên sẽ là 64 bit?] (Http://stackoverflow.com/questions/870401/what-are-the-specifics-of-setting-up-php-so-that-integers-will-be-64-bit) –

Trả lời

69

Số nguyên 64 bit gốc yêu cầu phần cứng 64 bit VÀ phiên bản 64 bit của PHP.

Mở phần cứng 32-bit:

$ php -r 'echo PHP_INT_MAX;' 
2147483647 

Mở phần cứng 64-bit:

$ php -r 'echo PHP_INT_MAX;' 
9223372036854775807 
+0

Tôi nghĩ rằng hầu hết PC mới hiện nay có thể chạy 64 -bit Windows Vista? Đó có phải là những gì cần thiết? Hệ điều hành 64 bit và sau đó cài đặt phiên bản PHP 64 bit? tại trang tải xuống của PHP tôi không thấy phiên bản 64 bit. ai đó có thể chỉ cho tôi không? nó là "PHP 5.2.1 x64 Project"? –

+0

Tôi không biết cụ thể của Vista (mặc dù, có, bạn sẽ cần hệ điều hành 64-bit quá) .. có vẻ như các nhị phân biên dịch chỉ có sẵn tại URL này và không có trên trang web PHP (tìm thấy này là kết quả đầu tiên khi Googling "64-bit PHP"): http://www.fusionxlan.com/PHPx64.php Và nếu biên dịch từ nguồn, chỉ có một phiên bản cho 32-bit và 64-bit .. – scotts

+0

ở trên * chỉ * hoạt động trên phần cứng x64 "với" phiên bản PHP x64 (không chính thức) được cài đặt. Có phiên bản 32 bit chính thức mới nhất được cài đặt trên hệ điều hành x64 mang lại kết quả đầu tiên (và bạn có thể phải sử dụng dấu ngoặc kép để nhập câu lệnh trên). – Bil

7

Kích thước int PHP phụ thuộc vào nền tảng. Có một hàm được gọi là giải nén() về cơ bản cho phép chuyển đổi các loại dữ liệu khác nhau từ chuỗi nhị phân sang biến PHP. Nó có vẻ là cách duy nhất để lưu trữ như là 64 bit là để lưu trữ nó như là một chuỗi.

tôi thấy đoạn mã sau vào: http://www.mysqlperformanceblog.com/2007/03/27/integers-in-php-running-with-scissors-and-portability/

/// portably build 64bit id from 32bit hi and lo parts 
function _Make64 ($hi, $lo) 
{ 

     // on x64, we can just use int 
     if (((int)4294967296)!=0) 
      return (((int)$hi)<<32) + ((int)$lo); 

     // workaround signed/unsigned braindamage on x32 
     $hi = sprintf ("%u", $hi); 
     $lo = sprintf ("%u", $lo); 

     // use GMP or bcmath if possible 
     if (function_exists("gmp_mul")) 
      return gmp_strval (gmp_add (gmp_mul ($hi, "4294967296"), $lo)); 

     if (function_exists("bcmul")) 
      return bcadd (bcmul ($hi, "4294967296"), $lo); 

     // compute everything manually 
     $a = substr ($hi, 0, -5); 
     $b = substr ($hi, -5); 
     $ac = $a*42949; // hope that float precision is enough 
     $bd = $b*67296; 
     $adbc = $a*67296+$b*42949; 
     $r4 = substr ($bd, -5) + + substr ($lo, -5); 
     $r3 = substr ($bd, 0, -5) + substr ($adbc, -5) + substr ($lo, 0, -5); 
     $r2 = substr ($adbc, 0, -5) + substr ($ac, -5); 
     $r1 = substr ($ac, 0, -5); 
     while ($r4>100000) { $r4-=100000; $r3++; } 
     while ($r3>100000) { $r3-=100000; $r2++; } 
     while ($r2>100000) { $r2-=100000; $r1++; } 

     $r = sprintf ("%d%05d%05d%05d", $r1, $r2, $r3, $r4); 
     $l = strlen($r); 
     $i = 0; 
     while ($r[$i]=="0" && $i<$l-1) 
      $i++; 
     return substr ($r, $i);   
    } 

    list(,$a) = unpack ("N", "\xff\xff\xff\xff"); 
    list(,$b) = unpack ("N", "\xff\xff\xff\xff"); 
    $q = _Make64($a,$b); 
    var_dump($q); 
10

Có lẽ bạn có thể sử dụng một trong hai GMP hoặc BCMath mở rộng.

50

UPDATE: Nó bây giờ (thử nghiệm trên AMD Quad Core, Windows 8.1).

Lưu ý rằng PHP trên Windows không hỗ trợ các số nguyên 64 bit, ngay cả khi cả phần cứng và PHP là 64 bit. Xem this link để biết chi tiết:

Trên cửa sổ x86_64, PHP_INT_MAX là 2147483647. Điều này là do trong cơ bản c-mã, một chặng đường dài là 32 bit.

Tuy nhiên, Linux trên x86_64 sử dụng một 64bit dài nên PHP_INT_MAX sẽ là 9223372036854775807.

+3

Ý của bạn là gì "hiện tại"? Tôi thấy rằng PHP 7 trên Windows 64 hỗ trợ các số nguyên 64 bit. Có bản phát hành 5.x PHP nào không? Nếu vậy, bạn lấy nó ở đâu? –

+0

Tôi cũng quan tâm đến cách nhận hỗ trợ int 64 bit trên Windows –

+0

Hiện tại, anh ấy có nghĩa là PHP 7, điều này được gọi là [Hỗ trợ 64 bit nhất quán] (http://php.net/releases/7_0_0. php). – Benjamin

5

Bây giờ bạn sẽ nhận được PHP 7 - Hỗ trợ 64bit hoàn toàn phù hợp. Không chỉ số nguyên, mà còn tất cả các fstat, IO, vv PHP 7 trên Windows là đúng 64-bit.

+0

Tôi vừa nâng cấp lên các số nguyên PHP 7 và 64 bit vẫn không có sẵn. Bất kỳ ý tưởng những gì tôi có thể làm gì? –

+1

Clifton, đảm bảo bạn đang sử dụng bản dựng 64 bit. –

+0

Vâng, hóa ra máy chủ Ubuntu của tôi chỉ là 32-bit. Tôi phải nâng cấp. –

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