Comunitatea PHP Romania
MightyDeals

Prima pagină PHP General Cod PHP pagina cu functii (externa)

pagina cu functii (externa)

Ai o întrebare legată de PHP? Incercăm să îi găsim soluţie. Sau poate doar vrei să publici un cod interesant.

Mesaj Dum Oct 16, 2011 9:48 am
wmaster Average Member

Mesaje: 61
salut,de curand am facut un script php!contine o pagina : 'functii.ini' (cu toate functiile necesare) ,cum pot face ca acea pagina s-o mut pe alt server si scriptul meu sa-mi preia datele de acolo?am incercat cu file_get_contents,insa nu merge!si pagina area vreo 300 de kb,deci file_get_contents ar incetini mult rularea scriptului,aveti vreo idee ceva?

Mesaj Dum Oct 16, 2011 7:34 pm
zeuscool Avatar utilizator
Senior Member

Mesaje: 250
Localitate: Constanta

Foloseste asta:

<?php
class Utile_ConectorLaDistanta
{
   protected $_url;
   protected $_fisierLaDistanta;
   protected $_eroare;
   protected $_partiURL;
   protected $_status;

   public function __construct($url, $tip = null)
   {
      $this->_url = $url;
      $this->verificaURL();
      if ($tip == 1)
      {
         $this->accesDirect();
      }
      else if ($tip == 2)
      {
         $this->folosesteCurl();
      }
      elseif (ini_get('allow_url_fopen'))
      {
         $this->accesDirect();
      }
      else if (function_exists('curl_init'))
      {
         $this->folosesteCurl();
      }
      else
      {
         $this->folosesteSocket();
      }
   }

   protected function verificaURL()
   {
      $steaguri = FILTER_FLAG_SCHEME_REQUIRED | FILTER_FLAG_HOST_REQUIRED;
      $urlBun = filter_var($this->_url, FILTER_VALIDATE_URL, $steaguri);
      $this->_partiURL = parse_url($this->_url);
      $domeniuBun = preg_match('/^[^.]+?\.\w{2,4}/', $this->_partiURL['host']);
      if (!$urlBun || $this->_partiURL['scheme'] != 'http' || !$domeniuBun)
      {
         throw new Exception ($this->_url . ' nu este o adresa web corecta.');
      }
   }

   protected function accesDirect()
   {
      $this->_fisierLaDistanta = @ file_get_contents($this->_url);
      $cap = @ get_headers($this->_url);
      if ($cap)
      {
         preg_match('/\d{3}/', $cap[0], $m);
         $this->_status = $m[0];
      }
   }

   protected function folosesteCurl()
   {
      if ($session = curl_init($this->_url))
      {
         // Interzice headere HTTP
         curl_setopt($session, CURLOPT_HEADER, false);
         // Citeste fisierul la distanta intr-un sir de caractere,
         // in loc sa il arati direct
         curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
         // Citeste fisierul la distanta si scrie fisierul la distanta
         // in proprietatea $_fisierLaDistanta
         $this->_fisierLaDistanta = curl_exec($session);
         // Afla status HTTP
         $this->_status = curl_getinfo($session, CURLINFO_HTTP_CODE);
         // Inchide sesiunea cURL
         curl_close($session);
      }
      else
      {
         $this->_eroare = 'Nu am putut crea o sesiune cURL.';
      }
   }

   protected function folosesteSocket()
   {
      $port = isset($this->_partiURL['port']) ? $this->_partiURL['port'] : 80;
      $distanta = fsockopen($this->_partiURL['host'], $port, $errno, $errstr, 30);
      if (!$distanta)
      {
         $this->_fisierLaDistanta = false;
         $this->_eroare = 'Nu am putut crea o conexiune socket: ';
         if ($errstr)
         {
            $this->_eroare .= $errstr;
         }
         else
         {
            $this->_eroare .= 'verifica numele domeniului sau adresa IP.';
         }
      }
      else
      {
         // Adauga sirul de cerere la cale, daca exista
         if (isset($this->_partiURL['query']))
         {
            $cale = $this->_partiURL['path'] . '?' . $this->_partiURL['query'];
         }
         else
         {
            $cale = $this->_partiURL['path'];
         }
         // Creare headere cerute
         $afara = "GET $cale HTTP/1.1\r\n";
         $afara .= "Host: {$this->_partiURL['host']}";
         $afara .= "Connection: Colse\r\n\r\n";
         // Trimite headere
         fwrite($distanta, $afara);
         // Citeste raspunsul
         $this->_fisierLaDistanta = stream_get_contents($distanta);
         fclose($distanta);
         if ($this->_fisierLaDistanta)
         {
            $this->scoateHeadere();
         }
      }
   }

   protected function scoateHeadere()
   {
      $parti = preg_split('#\r\n\r\n|\n\n#', $this->_fisierLaDistanta);
      if (is_array($parti))
      {
         $headere = array_shift($parti);
         $fisier = implode("\n\n", $parti);
         if (preg_match('#HTTP/1\.\d\s+(\d{3})#', $headere, $m))
         {
            $this->_status = $m[1];
         }
         if (preg_match('#Content-Type:([^\r\n]+)#i', $headere, $m))
         {
            // Tine in functie de Content-Type
            if (stripos($m[1], 'xml') !== false || stripos($m[1], 'html' !== false))
            {
               if (preg_match('/<.+>/s', $fisier, $m))
               {
                  $this->_fisierLaDistanta = $m[0];
               }
               else
               {
                  $this->_fisierLaDistanta = trim($fisier);
               }
            }
         }
         else
         {
            $this->_fisierLaDistanta = trim($fisier);
         }
      }
   }

   public function citesteMesajEroare()
   {
      if (is_null($this->_eroare))
      {
         $this->scrieMesajEroare;
      }
      return $this->_eroare;
   }

   public function scrieMesajEroare()
   {
      if ($this->_status == 200 && $this->_fisierLaDistanta)
      {
         $this->_eroare = '';
      }
      else
      {
         switch ($this->_status)
         {
            case 200:
            case 204:
               $this->_eroare = 'Connection OK, but file is empty.';
               break;
            case 301:
            case 302:
            case 303:
            case 307:
            case 410:
               $this->_eroare = 'File has been moved or does not exist.';
               break;
            case 305:
               $this->_eroare = 'File must be accessed through a proxy.';
               break;
            case 400:
               $this->_eroare = 'Malformed request.';
               break;
            case 401:
            case 403:
               $this->_eroare = 'You are not authorized to access this page.';
               break;
            case 404:
               $this->_eroare = 'File not found.';
               break;
            case 407:
               $this->_eroare = 'Proxy requires authentication.';
               break;
            case 408:
               $this->_eroare = 'Request timed out.';
               break;
            case 500:
               $this->_eroare = 'The remote server encountered an internal error.';
               break;
            case 503:
               $this->_eroare = 'The server cannot handle the request at the moment.';
               break;
            default:
               $this->_eroare = 'Undefined error. Check URL and domain name.';
         }
      }
   }

   public function __toString()
   {
      if (!$this->_fisierLaDistanta)
      {
         $this->_fisierLaDistanta = '';
      }
      return $this->_fisierLaDistanta;
   }
}

Mesaj Dum Oct 16, 2011 8:41 pm
wmaster Average Member

Mesaje: 61
pff :D:D zeus sincer....m-ai injurat de mama =)))
deci am site-ul domeniu.ro/functii.ini si domeniul cerere.ro,cum apelez functiile din cerere.ro la domeniu.ro?
trebuie sa imi preia datele din functii.ini de pe domeniu.ro
:D da-mi un exemplu te rog

Mesaj Dum Oct 16, 2011 11:58 pm
Drk_alien Average Member

Mesaje: 93
Localitate: Oradea

Poi asa ar trebuii sa mearga :

include "http://www.domeniu.ro/functii.ini";
apel_functie_din_ini();

....parerea mea...

Mesaj Lun Oct 17, 2011 9:00 am
wmaster Average Member

Mesaje: 61
pai da,dar chestia e ca nu stiu sa le apelez ! am incercat asa:
$test = new Utile_ConectorLaDistanta;
$test->function __construct('domeniu.ro/functii.ini', 2);

dar imi da unele erori..

Mesaj Lun Oct 17, 2011 9:03 am
teachme Avatar utilizator
Senior Member

Mesaje: 550
intai sa vad daca ce am inteles eu este ceea ce vrei tu :D

eu am inteles ca tu vrei sa pui pe un server nustiuce.com un fisier cu functii.
de pe alte domenii vrei sa poti accesa aceste functii.

din cunostintele mele, e drept, limitate pana acum, cred ca nu se poate.
d-aia si youtube a facut ceea ce se cheama un API pentru ca alte siteuri sa poata accesa anumite 'functii'.

pe aceeasi idee poti merge si tu.
fiecare site de-al tau va accesa un script de pe nustiuce.com, caruia ii va transmite o cheie de identificare (ca sa nu acceseze si alte persoane) impreuna cu niste variabile in functie de care scriptul va returna un anumit continut.

poti folosi scriptul lui zeuscool pt asta.
o sa accesezi link-ul http://nustiuce.com/script.php?cheie=fd ... steazaceva si el va returna ceva ce vei folosi pe site-ul respectiv.

Mesaj Lun Oct 17, 2011 9:08 am
teachme Avatar utilizator
Senior Member

Mesaje: 550
functia __construct dintr-o clasa este executata automat.
[php]<?php
$url = 'http://nustiuce.com/fisier.php';
$test = new Utile_ConectorLaDistanta($url ,2);
echo $test -> __toString();
?>[/php]

LE:
Pentru cine se intreaba, "oare de ce nu se poate include un fisier remote astfel incat sa pot folosi niste functii ?", raspunsul este destul de evident.

- Ce s-ar intampla daca as afla unde sunt datele de conectare la baza de date ale unui site si as folosi include ?
- Dezastru !

Mesaj Lun Oct 17, 2011 9:23 am
wmaster Average Member

Mesaje: 61
am inteles,si ms mult !atunci exista o alta cale sa pot face acea pagina sa mearga doar cu permisiunea mea?chiar daca o ia altcineva,sa poata scoate niste cereri de la mine,eu as avea o idee !
pe domeniul meu fac o pagina care sa extraga HTTP_REFERER,apoi un tabel in mysql sa-mi caute daca acel referrer este adaugat + o cheie (cod,ceva).
Si in pagina de pe celalalt domeniu sa ia ceva asemanator cu :
$test = file_get_contents('domeniu.ro?verify.php?domain=".$_SERVER['SERVER_NAME']."&key=123456789');
if($test == true){
echo "scriptul poate rula";
}else{
echo "denied";
}

se poate face asa ceva,dar oricine ar putea scoate aceasta verificare....

Mesaj Lun Oct 17, 2011 9:41 am
teachme Avatar utilizator
Senior Member

Mesaje: 550
nu te ajuta $_SERVER['SERVER_NAME'].
as folosi doar cheia si pe server as verifica IP-ul.
din cate stiu nu prea se modifica IP-ul hostingului.

Mesaj Lun Oct 17, 2011 9:43 am
wmaster Average Member

Mesaje: 61
da,se poate face in multe moduri,dar cum as putea sa fac sa nu se scoata functia aceea?

Mesaj Lun Oct 17, 2011 9:56 am
teachme Avatar utilizator
Senior Member

Mesaje: 550
verificarile se fac pe serverul cu 'functiile'.
daca nu respecta conditiile, nu returnezi nimic.

Mesaj Lun Oct 17, 2011 10:42 am
lucianmoi PHPRomania Supporter

Mesaje: 22
Salut,

de ce nu faci un webService? Asa poti "consuma" proprietatile si metodele la distanta.

Mesaj Lun Oct 17, 2011 2:20 pm
kyron Avatar utilizator
Senior Member

Mesaje: 639
Localitate: Bucuresti

1. Nu te baza pe HTTP_REFERER
2. Nu mai tine functii php in fisiere .ini
3. De ce nu incluzi fisierul respectiv si in celalalt site si astfel nu te mai complici ?

Mesaj Lun Oct 17, 2011 2:34 pm
teachme Avatar utilizator
Senior Member

Mesaje: 550
3. De ce nu incluzi fisierul respectiv si in celalalt site si astfel nu te mai complici ?

Daca voia asta, crezi ca nu facea asa ? :D
Eu as zice ca vrea sa faca siteuri pt mai multe persoane si se teme ca beneficiarii vor vinde mai departe.
Si probabil s-a gandit sa puna chestiile importante pe un server de-al lui.

Mesaj Lun Oct 17, 2011 2:44 pm
wmaster Average Member

Mesaje: 61
bravo teachme ! :) (touche)
si sunteti sigur ca nu am ce face?:D

Mesaj Dum Apr 14, 2013 12:55 am
Google Bot New Member

Mesaje: 1
Următorul

Înapoi la Cod PHP

Copyright © 2001-2013 PHP Romania Gazduire web | Haine online | Gazduire web | Campanii SMS | Gazduire Claus Web | Inregistrare Domenii | Anunturi | Jocuri cu bile
Furnizat de phpBB® Forum Software © phpBB Group
Translation/Traducere: phpBB România
Powered by Simplis