2013-07-24 4 views
5

Mam zainstalowany WampServer 2.0, który ma apache 2.4.4, mysql 5.6.12 i php 5.4.12. Kiedy echo PHP_INT_MAX dał mi 2147483647. Mam również echo phpinfo() i architektura wskazuje x64. Przypuszczam, że tak się nie dzieje, ponieważ mój php jest 64-bitowy, prawda? Potrzebuję mojego php do obsługi 64-bitowej liczby całkowitej. Potrzebuję mojego PHP_INT_MAX do 9223372036854775807.php 64-bitowy z php_int_max = 2147483647

Czy ktoś może mi pomóc? Dzięki

+0

* 'long' musi stać się' long long' w źródle PHP. Następnie zrekompiluj! :) - nie mam pojęcia, czy to zadziała, ponieważ może to wszystko zepsuć wszędzie. * Mam nadzieję, że ostatecznie przejdą do 64-bitowej reprezentacji. Ale nie możesz nic z tym zrobić. Mam też nadzieję, że pójdą na Unicode ... ale nie ma nadziei. – CodeAngry

+0

Nie jestem teraz w 100% na prawdę i jestem zbyt zajęty, aby to sprawdzić, ale 'floats' w PHP to' double' które SĄ '' 64bit' nawet w Windowsie, a 'floats' to 32bit. Więc możesz spróbować ich użyć. – CodeAngry

+0

Problem polega na tym, że nie mogę kontynuować mojego kodu, gdy go uruchomię, ponieważ próbuję zintegrować Dropbox z moją witryną, kiedy uruchamiam mój kod za pomocą Dropbox sdk, jest to błąd, który stwierdza, że ​​moja wersja php doesn ' t obsługuje 64-bitową liczbę całkowitą, więc nie mogę kontynuować integracji. – mikellez

Odpowiedz

9

Jeśli uruchomiony system operacyjny Windows, -WampSerwer sugeruje jesteś, this is your answer:

On windows x86_64, PHP_INT_MAX is 2147483647. This is because in the underlying c-code, a long is 32 bit.

Należy pamiętać, że nie oznacza to, że system Windows nie obsługuje 64-INT: istnieje int64_t, ale to nie używane przez PHP AFAIK.
udało mi się wymyślić this link na tej stronie jest jakiś kod może być w stanie wykorzystać, aby dodać wsparcie dla int 64-bitowych do kodu

+0

dzięki za odpowiedź. Czy istnieje jakiś sposób rozwiązania tego problemu? Naprawdę nie rozumiem, co to znaczy, że mam do czynienia z linkiem, który mi dałeś. – mikellez

+0

@ user2615039: [istnieje hacky obejście] (http://www.mysqlperformanceblog.com/2007/03/27/integers-in-php-running-with-scars-and-portability/), który nie wymagać, aby przejść do Linux;) –

4

W pliku RequestUtil.php, robi co następuje sprawdzenie:

if (strlen((string) PHP_INT_MAX) < 19) { 
    // Looks like we're running on a 32-bit build of PHP. This could cause problems because some of the numbers 
    // we use (file sizes, quota, etc) can be larger than 32-bit ints can handle. 
    throw new \Exception("The Dropbox SDK uses 64-bit integers, but it looks like we're running on a version of PHP that doesn't support 64-bit integers (PHP_INT_MAX=" . ((string) PHP_INT_MAX) . "). Library: \"" . __FILE__ . "\""); 
} 

można skomentować go i spróbować hacking drogę stamtąd.

Gdybym był tobą, napisałbym własną implementację API Dropbox za pomocą łańcuchów, a nie liczb całkowitych.

PS: Ale to, co robię, więc mi to przyjemność :)

+0

dzięki za alternatywne rozwiązanie, po prostu mam nadzieję, że nie spowoduje później problemów. – mikellez

+0

@ user2615039 ** To może **, * ale możesz przynajmniej przejść do testowania. * Zawsze staraj się traktować długie liczby całkowite jako ciąg znaków i możesz uniknąć tego. – CodeAngry

1

Spróbuj PHP7 - aktualny mistrz http://windows.php.net/downloads/snaps/master/. 64-bitowe kompilacje wykorzystują teraz wszystkie możliwości 64-bitowego systemu Windows.

+0

"PHP 7 zapewnia pełną 64-bitową obsługę, kompilacje x64 z PHP 7 obsługują natywne 64-bitowe liczby całkowite, LFS, limit_umierania i wiele więcej." Tak więc, wszystkie kompilacje, nie tylko master: http://windows.php.net/download/ –

+0

Tak, 7.0 było mistrzem do czasu wysłania :) Po GA to teraz każda kompilacja OFC. –

-1

Próbowałem php7 i to działało:

running php.exe -r "echo PHP_INT_MAX;"

i wyprowadza 9223372036854775807

1

Idź do 'vendor/Dropbox/Dropbox-SDK/lib/Dropbox'
i komentarz linii 19- 23 w RequestUtil.php.

Komentarz ten dział:

/*if (strlen((string) PHP_INT_MAX) < 19) { 
    // Looks like we're running on a 32-bit build of PHP. This could cause problems because some of the numbers 
    // we use (file sizes, quota, etc) can be larger than 32-bit ints can handle. 
    throw new \Exception("The Dropbox SDK uses 64-bit integers, but it looks like we're running on a version of PHP that doesn't support 64-bit integers (PHP_INT_MAX=" . ((string) PHP_INT_MAX) . "). Library: \"" . __FILE__ . "\""); 
}*/ 

To wszystko.