PHP u PAWN-u
Skoro sam se suocio sa problemom multi-threaded zahteva u pisanoj formi sistema za razmenu poruka za svoj projekat. Sustina problema je da upravo izracuna broj dolaznih i odlaznih poruka od odredjenog korisnika. Dakle, sve u principu moze, ali bi morali za svaki zahtev da kreirate poseban Public, zato je tu multi-threaded. To izgleda sve redu, dva zahteva = dva Publica, nije to pogresno, to je samo prljavstina od koda.
Resenje:
Zapravo, nalazio sam na internetu gomilu korisnih stvari, medjutim, nisu odgovarali mojim potrebama. Ubrzo nakon malo guglanja, odlucio sam da ostanem u dobrim funkcijama kao sto su HTTP();.
Funkcija parametri(index, type, url[], data[], callback[])
index - ID (playerid, giveplayerid)
type - tip zahteva koji zelite da posaljete
url[] - URL query (bez "http://")
data[] - sve poruke i podaci koji ce biti poslati na zahtev
callback[] - ime callback funkcije, ako zelite da koristite za obradu odgovara na zahtev.
Vrste upita (type):HTTP_GET - Salje zahtev na HTTP.
HTTP_POST - Salje zahtev podacima (data).
HTTP_HEAD - Salje zahteve na HTTP, ali ignorise sve odgovore u podacima(data).
Response codes:HTTP_ERROR_BAD_HOST 1
HTTP_ERROR_NO_SOCKET 2
HTTP_ERROR_CANT_CONNECT 3
HTTP_ERROR_CANT_WRITE 4
HTTP_ERROR_CONTENT_TOO_BIG 5
HTTP_ERROR_MALFORMED_RESPONSE 6
Standardni Response codes:HTTP 404 (stranica nije pronadjena), 500 (server error) ili 403 (forbidden).
Dalje o opisu i primerima funkcije necu ici. Kome treba -> Google u ruke i search.
Koriscenje funkije u praksi
U mom slucaju HTTP interakciju sa PHP fajlom na serveru koja salje specijalni zahtev i prima kodiran(ako je potrebno) odgovor, koji se kasnije desifruje, i zatim koristi po potrebi.
Primer:[pawn]/* Na vrh moda */
#define PHP_FILE_LOCATION "adresa/ime.php" //Web adresa ( putanja ) do vaseg PHP fajla ( bez http:// )
#define SECURITY_CODE "12345" // Sigurnosni kod. Koristi se za sprecavanje neovlascenog pristupa php fajlu.
#include <a_php>[/pawn]
Ovo je radni kod sa kojim zelim da dobijem broj primljenih/poslatih poruka odredjenom korisniku.[pawn]new parameters[24], switch_case[24] = "inputAndOutputMessages";
format(parameters, sizeof(parameters), "%s", getName(playerid));
RunMySQLQuerySwitch(100, switch_case, parameters); // Posaljite zahtev[/pawn]
PHP fajl
[pawn]define('SECURITY_CODE', 'Ovo je sigurnosni kod koji se mora poklapati sa onim iz PAWNa.');
if($_POST[security] == SECURITY_CODE)
{
$caseQuery = mysql_real_escape_string($_POST[switch_case]);
if(!empty($caseQuery))
{
switch($_POST[switch_case])
{
case "inputAndOutputMessages":
// Ovde sta zelimo da uradimo.
die;
break;
}
} else {
echo 'Error.';
}
} else {
echo('Pogresan sigurnosni kod!');
}[/pawn]
[INC] a_php.inc[pawn]#include <a_http>
#define MAX_PHP_LENGTH 256
forward OnServerTryingToRunPHP(index, response_code, data[]);
forward OnScriptResponse(scriptid, contents[]);
stock RunMySQLQuerySwitch(scriptid, const switch_case[], const parameters[])
{
new string[MAX_PHP_LENGTH+5];
format(string, sizeof(string), "switch_case=%s¶meters=%s&security="SECURITY_CODE, switch_case, parameters);
HTTP(scriptid, HTTP_POST, PHP_FILE_LOCATION, string, "OnServerTryingToRunPHP");
}
public OnServerTryingToRunPHP(index, response_code, data[])
{
if(response_code != 200)
{
printf("Greska: %d, pokusava da sastavi PHP na spoljnom serveru.", response_code);
return 0;
}
CallLocalFunction("OnScriptResponse", "ds", index, data); // Povratak kod odgovora u PAWNu
return 1;
}[/pawn]
Obrada server response-a[pawn]public OnScriptResponse(scriptid, contents[])
{
if(scriptid == 100) // Navedite sta da radi sa odredjenim upitom ID
// Ovde akcija
// Ako zelite, mozete nositi zahteve pristigle iz kodiranja
return 1;
}[/pawn]