Ciao a tutti!
Torno su questo forum dopo qualche anno, nella ferma convinzione che nessuno più abbia la più pallida idea di chi sono, per porvi una questione su cui sono arenato da ieri pomeriggio.

Voglio creare un piccolo script PHP che interagisca con un server TeamSpeak3 mediante ServerQuery. Per farlo, ho provato sia con il framework quasi-ufficiale che con un altro framework. Siccome chi fa da sé fa per tre, ho infine provato ad arrangiarmi con:
Codice PHP:
<?php

$ts3_ip
= "216.127.64.74"; # IP Server TS3.
$ts3_qport = 10015; # Porta per SQ.
$ts3_port = 3921; # Porta del server TS3.
$ts3_user = "sonobello"; # Nome utente SQ.
$ts3_pass = "pwdsupersicura"; # Password utente SQ.

function command ( $ts, $string )
{
# Esecuzione comando e lettura risultato.
fwrite($ts, $string); # Invio comando.

$result = "";
while (!
feof($ts))
$result .= fgets($ts, 128); # Lettura risultato. Forse andava bene anche un fgets($ts) e stop, ma mi piace complicarmi la vita.

$result = explode("|", $result);
foreach (
$result as &$row)
{
$row = explode(" ", $row);
$tmp = array();
foreach (
$row as $r)
{
list(
$k, $v) = explode("=", $r);
$v = str_replace("\s", " ", $v);
$tmp[$k] = $v;
}
$row = $tmp;
}
return (
count($result) == 1) ? array_shift($result) : $result;
}

header("Content-type: text/plain"); # Il font monospace mi piace di più.
$ts3 = fsockopen($ts3_ip, $ts3_qport, $errn, $errm, 10); # Connessione.
if ($errn != 0)
{
# Errore di connessione.
echo "Error {$errn}: {$errm}." . PHP_EOL;
exit;
}
print_r(command($ts3, "login {$ts3_user} {$ts3_pass}")); # Login SQ.
print_r(command($ts3, "use port={$ts3_port}")); # Selezione server virtuale.
print_r(command($ts3, "sendtextmessage targetmode=3 msg=Testing\sPHP-to-TS3\sconnection")); # Prova invio messaggio.
fclose($ts3); # BB.
Per la cronaca, nel caso dei frameworks il codice sarebbe un tantino più compatto:
Codice PHP:
<?php
# Impostazioni come sopra.

require_once("libraries/TeamSpeak3/TeamSpeak3.php"); # Framework quasi-ufficiale.
$ts3 = TeamSpeak3::factory("serverquery://{$ts3_user}:{$ts3_pass}@{$ts3_ip}:{$ts3_qport}/?server_port={$ts3_port}"); # Connessione + login SQ + selezione server virtuale.
$ts3->message("Testing PHP-to-TS3 connection"); # Prova invio messaggio.

# OPPURE

require("ts3admin.class.php");
$ts3 = new ts3admin($ts3_ip, $ts3_qport); # Istanza oggetto.
$ts3->connect(); # Connessione.
$ts3->login($ts3_user, $ts3_pass); # Login SQ.
$ts3->selectServer($ts3_port); # Selezione server virtuale.
$ts3->sendMessage(3, 1, "Testing PHP-to-TS3 connection"); # Prova invio messaggio.
Ho già letto questo thread in cui viene spiegato che la connessione che mi serve, dal momento che dovrei connettermi alla porta 10011 o alla 10015, qui su AlterVista non s'ha da fare, e di fatti ricevo sempre errori di tipo "connection lost" e compagnia. Peccato perché mi avrebbe fatto comodo in fase di test, ma fino a un certo punto, dal momento che questo script vorrei farlo girare su un server di cui ho pieno controllo. Il punto è che anche lì i problemi spuntano come le bimbeminkia a un concerto di una qualsivoglia boy-band. In questo caso, però, l'errore è di "connection timeout".

Non so veramente dove sbattere la testa:
  • I parametri di connessione sono giusti, perché connettendomi con Telnet (software Putty, nello specifico) fila tutto liscio come l'olio.
  • Ho provato a connettermi a un altro server TeamSpeak, da un differente servizio di hosting, e niente.
  • Ho controllato che il server web da cui provo non blocchi l'IP del server TS, e viceversa che l'IP del webserver non sia bannato dal server TS.
  • Ho provato su due servizi hosting web differenti.
  • Ho provato con lo script da server Apache locale a connettermi a un server TS hostato sulla stessa macchina.
  • Ho cercato ossessivamente su Google e StackOverflow per ore ieri pomeriggio, stanotte e stamattina.

In tutto ciò finora ho fallito. La cosa più irritante è che il web è pieno di gente che declama la bellezza di questi framework per PHP, la loro comodità, e altre cose che mi lasciano pensare che molti autori di questi messaggi si siano recentemente votati a una nuova divinità.

La domanda è: come devo configurare il mio server per far funzionare tutto ciò? Sbaglio qualcosa nel PHP, o istruzioni che dovrei mettere in un .htaccess? Ho bisogno di particolari impostazioni nel php.ini o nel httpd.conf, o ancora in un eventuale firewall da qualche parte?