2009-05-14 14 views
55

क्या कोई जानता है कि PHP पर 64 बिट पूर्णांक कैसे है? ऐसा लगता है कि यह कॉन्फ़िगरेशन फ़ाइल द्वारा नहीं है बल्कि यह संकलन समय विकल्प हो सकता है और यह मंच पर निर्भर करता है?PHP पर 64 बिट पूर्णांक कैसे है?

+1

मैं "हर पूर्णांक 64-बिट समाधान" की अधिक खोज कर रहा था, इसलिए बड़े पूर्णांक के लिए मॉड्यूल का उपयोग नहीं करना चाहूंगा। –

+1

साइड नोट: मुझे कुछ 64-बिट PHP बाइनरी मिलीं: http://tommymontgomery.com/php64 –

+0

संभावित डुप्लिकेट [PHP सेट अप करने के विनिर्देश क्या हैं ताकि पूर्णांक 64-बिट हो?] (Http://stackoverflow.com/questions/870401/what-are-the-specifics-of-setting-up-php-so-that-integers-will-be-64-bit) –

उत्तर

69

मूल 64-बिट पूर्णांक के लिए 64-बिट हार्डवेयर और PHP के 64-बिट संस्करण की आवश्यकता होती है।

32-बिट हार्डवेयर पर:

$ php -r 'echo PHP_INT_MAX;' 
2147483647 

64-बिट हार्डवेयर पर:

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

मैंने सोचा कि आजकल अधिकांश नए पीसी 64 चला सकते हैं विंडोज विस्टा विस्टा? क्या यह जरूरी है? 64-बिट ओएस और उसके बाद PHP का 64-बिट संस्करण स्थापित करें? PHP के डाउनलोड पेज पर मुझे 64-बिट संस्करण नहीं मिला। क्या कोई मुझे इसके लिए इंगित कर सकता है? क्या यह "PHP 5.2.1 x64 प्रोजेक्ट" है? –

+0

मुझे Vista के विवरण नहीं पता हैं (हालांकि, हाँ, आपको 64-बिट ओएस भी चाहिए) .. ऐसा लगता है कि इस यूआरएल पर केवल संकलित बाइनरी उपलब्ध हैं और PHP साइट पर नहीं (इसे इस रूप में मिला पहला परिणाम जब "64-बिट PHP" Googling): http://www.fusionxlan.com/PHPx64.php और स्रोत से संकलित होने पर, 32-बिट और 64-बिट के लिए केवल एक संस्करण है .. – scotts

+0

ऊपर * केवल * x64 हार्डवेयर "के साथ" PHP के एक (अनौपचारिक) x64 संस्करण के साथ काम करता है। X64 ओएस पर स्थापित नवीनतम आधिकारिक 32-बिट संस्करण होने से पहले परिणाम मिलते हैं (और आपको ऊपर दिए गए कथन में प्रवेश करने के लिए डबल-कोट्स का उपयोग करना पड़ सकता है)। – Bil

7

PHP int आकार प्लेटफ़ॉर्म-निर्भर है। अनपैक() नामक एक फ़ंक्शन है जो अनिवार्य रूप से विभिन्न प्रकार के डेटा को बाइनरी स्ट्रिंग से PHP चर के रूप में परिवर्तित करने की अनुमति देता है। यह स्टोर करने का एकमात्र तरीका प्रतीत होता है क्योंकि 64 बिट इसे एक स्ट्रिंग के रूप में स्टोर करना है।

मैं निम्न कोड मिला: 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

शायद तुम इस्तेमाल कर सकते हैं या तो GMP या BCMath विस्तार।

50

अद्यतन: अब यह (एएमडी क्वाड कोर, Windows 8.1 पर परीक्षण किया) है।

ध्यान दें कि विंडोज़ पर PHP 64-बिट पूर्णांक का समर्थन नहीं करता है, भले ही हार्डवेयर और PHP दोनों 64-बिट हों। जानकारी के लिए this link देखें:

खिड़कियों x86_64 पर, PHP_INT_MAX 2147483647 इसका कारण यह है अंतर्निहित सी कोड में, एक लंबे 32 बिट है है।

हालांकि, x86_64 पर linux लंबे समय से एक 64 बिट का उपयोग करता है तो PHP_INT_MAX 9223372036854775807.

+3

"अब यह करता है" से आपका क्या मतलब है? मैं देखता हूं कि विंडोज 64 पर PHP 7 64-बिट पूर्णांक का समर्थन करता है। क्या कोई PHP 5.x रिलीज है जो भी करता है? यदि हां, तो आपको यह कहां मिला? –

+0

मुझे इस बात पर भी रूचि है कि विंडोज –

+0

पर 64-बिट int समर्थन कैसे प्राप्त करें अब तक इसका मतलब है PHP 7, इसे [लगातार 64-बिट समर्थन] (http://php.net/releases/7_0_0] के रूप में जाना जाता है। php)। – Benjamin

5

अब आप PHP 7 मिलना चाहिए होने जा रहा है - पूरी तरह अनुरूप 64 बिट समर्थन करते हैं। न केवल पूर्णांक, बल्कि सभी fstat, IO, आदि विंडोज़ पर PHP 7 सच 64-बिट है।

+0

मैंने अभी PHP 7 और 64-बिट पूर्णांक में अपग्रेड किया है, अभी भी उपलब्ध नहीं हैं। कोई विचार क्या मैं कर सकता हूँ? –

+1

क्लिफ्टन, सुनिश्चित करें कि आप 64-बिट बिल्ड का उपयोग कर रहे हैं। –

+0

हाँ, यह पता चला कि मेरा उबंटू सर्वर केवल 32-बिट था। मुझे अपग्रेड करना पड़ा। –

संबंधित मुद्दे