2013-04-23 15 views
11

Ho PHP 5.3.3 installato su Centos 6.4 con l'estensione memcached.so e httpd è in esecuzione con la versione 2.2.15-26. Qui è la mia index.php:PHP, Memcached funziona dalla riga di comando ma non dal web

$mc = new \Memcached(); 
$mc->addServer('127.0.0.1', 11211); 
$mc->set("test", "blah"); 
var_dump($mc->getResultCode()); 
var_dump($mc->getResultMessage()); 
var_dump($mc->get("test")); 
die; 

quando l'eseguo dalla riga di comando, funziona. Ottengo il seguente:

10:22:33 $ php index.php 
int(0) 
string(7) "SUCCESS" 
string(4) "blah" 

Il server memcache funziona anche da telnet. Tuttavia, quando eseguo index.php dal Web, non riesce. ricevo il seguente (fonte di visualizzare pagina web):

int(47) 
string(51) "SERVER HAS FAILED AND IS DISABLED UNTIL TIMED RETRY" 
bool(false) 

corto di reinstallare il mio sistema operativo e provando diverse versioni di merda, qualcuno può spiegare che cosa potrebbe causare questo problema?

+1

php ha un file php.ini per la CLI e la versione web \ Apache, apportare le modifiche appropriate assicurarsi di aver reso sia –

+0

non dimenticare di ricaricare i cambiamenti – wayne

+0

@Dagon - Il file '/ etc/php.ini' contiene" extension = memcached.so "e sia la CLI che il web lo stanno usando. Penso che otterrei un errore "Memcached not found" se l'estensione non è stata installata nel file .ini ... – Fragsworth

risposta

2

È un problema SELinux? Cli può accedere a Memcached ma daemon no. Prova questo:

  • getenforce sapere se si dispone di SELinux abilitato
  • setenforce 0 per disattivarlo
  • reboot
  • ripetere la prova

Se è buono, è necessario configurare Apache per l'accesso Memcached.

+0

L'utente Apache probabilmente non ha diritto o qualcosa di strano. Quindi non funziona quando viene chiamato tramite Apache. – wally

0

Assicurarsi che il servizio memcache esegua il binding di tutti gli IP. Il valore predefinito è 127.0.0.1. cambiarlo in 0.0.0.0 per supportare tutti gli IP definiti. In aggiunta, non dimenticare di controllare il tuo iptables o firewall.

+0

Dubito che questo sia il problema - assumendo che stia descrivendo eseguendolo sul server web locale tramite CLI. SELinux sarebbe la mia ipotesi ... cosa fatta saltare! – wally

0

Quando guardo gli esempi, vedo che viene utilizzato senza il modificatore "\" dello spazio dei nomi. Prova senza forse?

http://www.php.net/manual/en/memcache.examples-overview.php

<?php 

$memcache = new Memcache; 
$memcache->connect('localhost', 11211) or die ("Could not connect"); 
+0

Quando non è definito lo spazio dei nomi per il file corrente, 'Memcache' e' \ Memcache' sono esattamente gli stessi. – rpkamp

0

Ho avuto questo problema in WAMP 2.4, l'esecuzione di un semplice script di test Memcache lavorato dalla linea di comando, ma non nel browser.

La risposta si è rivelata straordinariamente banale: WAMP aveva due file php.ini e stavo modificando quello sbagliato.

E.g. Apache usava questo: c: \ wamp \ bin \ apache \ Apache2.4.4 \ bin \ php.ini WAMP aveva anche questo: c: \ wamp \ bin \ php \ php5.4.12 \ php.ini

Mettere l'estensione = php_memcache.dll nel file .ini corretto risolve le cose.

Il mio indizio di questo tipo era il problema era che il file di configurazione caricato di phpInfo() ha riportato valori diversi nei due casi.

0

Ho avuto esattamente lo stesso problema descritto dall'OP. Si è scoperto che il problema era causato dall'elenco dei server che l'estensione memcached mantiene internamente.Il mio codice era qualcosa del tipo:

$serversList = $memcached->getServerList(); 

if (empty($serversList)) { 
    $memcached->addServer($host, $port); 
} 

La mia chiamata iniziale allo script di test è stata eseguita con un valore errato per $ port. La chiamata è stata effettuata da web (apache) non da cli. Dopo aver corretto la porta e ho eseguito di nuovo il codice, è stato saltato il "se" e ho utilizzato l'elenco dei server esistenti che era difettoso e quindi ha fallito nuovamente.

Vedere il guasto dal web ho provato con il cli e funzionava perfettamente. Nel cli la lista dei server era diversa da quella del web. Infatti, l'elenco dei server era vuoto ad ogni avvio dello script, anche se il mio script lo stava impostando ad ogni esecuzione. Eppure persisteva tra le chiamate sul web.

In ogni caso, dopo aver cancellato l'elenco dei server sul Web e impostato il server corretto, ha funzionato come previsto anche dal web.

0

Ho un problema simile su CentOS e quello che ho trovato è in esecuzione SELinux che impedisce a httpd di connettersi a memcached. È necessario impostare sotto,

# setsebool -P httpd_can_network_memcache 1 
# getsebool httpd_can_network_memcache 
httpd_can_network_memcache --> on 
Problemi correlati