2013-08-13 14 views
16

pracując nad wygenerowaniem pliku GUID w pliku php. Korzystam z com_create_guid(). Działa dobrze na localhost, ale pokazuje poniższy błąd na zdalnym serwerze.Funkcja com_create_guid() ma błąd po stronie serwera, ale działa poprawnie w trybie lokalnym przy użyciu php

Fatal error:Call to undefined function com_create_guid() on line 6

mój kod jest (część guid nly)

$guid = com_create_guid(); 
echo $guid; 

jakieś pomysły

+3

Albo twój zdalny serwer nie jest uruchomiony PHP 5, albo to z systemem Linux, a następnie nie można używać rozszerzenia COM. –

Odpowiedz

28

Można utworzyć GUID ręcznie:

function getGUID(){ 
    if (function_exists('com_create_guid')){ 
     return com_create_guid(); 
    } 
    else { 
     mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up. 
     $charid = strtoupper(md5(uniqid(rand(), true))); 
     $hyphen = chr(45);// "-" 
     $uuid = chr(123)// "{" 
      .substr($charid, 0, 8).$hyphen 
      .substr($charid, 8, 4).$hyphen 
      .substr($charid,12, 4).$hyphen 
      .substr($charid,16, 4).$hyphen 
      .substr($charid,20,12) 
      .chr(125);// "}" 
     return $uuid; 
    } 
} 

Zastosowanie:

$GUID = getGUID(); 
echo $GUID; 

następująco:

http://guid.us/GUID/PHP

http://php.net/manual/en/function.com-create-guid.php

+1

Próbowałem tego z 5 milionami identyfikatorów za każdym razem i 5 razy i nie otrzymałem żadnych duplikatów, więc zakładam, że jest to wystarczająco dobre również dla zastosowań biznesowych. – AaA

+0

Można w rzeczywistości użyć tego zamiast: sprintf ("% 04X% 04X-% 04X-% 04X-% 04X-% 04X% 04X% 04X", mt_rand (0, 65535), mt_rand (0, 65535), mt_rand (0, 65535), mt_rand (16384, 20479), mt_rand (32768, 49151), mt_rand (0, 65535), mt_rand (0, 65535), mt_rand (0, 65535)); jest to identyczna metoda używana w com_create_guid(); –

+0

Twoje zaszczepienie mt_rand, ale potem użycie właśnie rand. –

1

Musisz być uruchomiony PHP w wersji mniej niż 5 indziej musi być uruchomiony na Linuksie jako COM jest oparte na systemie Windows rozszerzenie a.

Wypróbuj ten skrypt i upewnij się, że.

if (function_exists('com_create_guid') === true) 
    { 
     echo "Yes"; 
     $guid = com_create_guid(); 
     echo $guid; 
    } 
else{ 
    echo "Nope !"; 
} 
8

przedłużyć częściowo poprawne odpowiedzi powyżej.

zaczerpnięte z http://php.net/manual/en/com.installation.php

„Od PHP 5.4.5, COM i DotNet nie jest już wbudowany w rdzeniu php Trzeba dodać COM wsparcie w php.ini”

extension = php_com_dotnet.dll

+0

Stosowanie 'extension = php_com_dotnet.dll' wydaje się działać tylko w systemie Windows Server, a nie w systemie Linux (Ubuntu 14) w wersji [* here *] (https://www.drupal.org/node/2614202) – hyip

0

Prawdopodobna przyczyna

systemy Windows, które nie mają php_com_dotnet.dll załadowany (sprawdź swój plik php.ini), jak również systemów innych niż Okna, nie będzie w stanie wykorzystać com_create_guid().

Rozwiązanie

I zmontowane i modyfikowane następujący kod jako kulminacji niektóre z moich własnych pomysłów i zmian (takich jak wsparcie nawiasów całej) oraz licznych propozycji z wielu źródeł na realizację przekrój platformy i krzyż Funkcja wersji PHP, która obsługuje usztywnione i nieuzbrojone tworzenie UID. Określanie false w wywołaniu funkcji zwróci UID zapakowany w nawiasy klamrowe ("styl Windows"). Podając true lub nic zwróci UID bez nawiasy klamrowe.

kompatybilności

PHP z góry wersji 4.2 jest obsługiwany. To jest agnostyka systemu operacyjnego i wybierze "najlepszą" metodę opartą na systemie operacyjnym, wersji PHP i dostępnych bibliotekach PHP/funkcje (w tym wywołanie opcji rezerwowej, jeśli biblioteka dotnet nie jest załadowana w systemie Windows PHP).

Kodeks

function GUIDv4 ($trim = true) 
{ 
    $lbrace = chr(123); // "{" 
    $rbrace = chr(125); // "}" 

    // Windows 
    if (function_exists('com_create_guid') === true) 
    { // extension=php_com_dotnet.dll 
     if ($trim === true) 
     {   
      return trim(com_create_guid(), '{}'); 
     } 
     else 
     { 
      return com_create_guid(); 
     } 
    } 


    // OSX/Linux and Windows with OpenSSL but without com classes loaded (extension=php_com_dotnet.dll loaded in php.ini) 
    if (function_exists('openssl_random_pseudo_bytes') === true) 
    { 

     $data = openssl_random_pseudo_bytes(16); 
     $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100 
     $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10 
     if ($trim === true) 
     {     
      return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4)); 
     } 
     else 
     { 
      return $lbrace.vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4)).$rbrace; 
     } 
    } 

    // Fallback (PHP 4.2+)  
    mt_srand((double)microtime() * 10000); 
    $charid = strtolower(md5(uniqid(rand(), true))); 
    $hyphen = chr(45);     // "-" 
    $guidv4 = substr($charid, 0, 8).$hyphen. 
       substr($charid, 8, 4).$hyphen. 
       substr($charid, 12, 4).$hyphen. 
       substr($charid, 16, 4).$hyphen. 
       substr($charid, 20, 12); 

    if ($trim === true) 
    {     
     return $guidv4; 
    } 
    else 
    { 
     return $lbrace.$guidv4.$rbrace; 
    }  
} 

Wykorzystanie

$newGUID = GUIDv4([false]); // false for braces, true or nothing for no braces 

Więcej informacji

http://php.net/manual/en/function.com-create-guid.php

http://php.net/manual/en/com.installation.php

http://guid.us/GUID/PHP

Powiązane problemy