oriolrius.cat

Des del 2000 compartiendo sobre…

Tag: php

PHPClasses: VirtualCron, GoogleMaps i InsertFTP

Reading time: 2 – 2 minutes

A través de PHPClasses he trobat aquestes tres classes de PHP que tenen bona pinta així que espero que algún dia li facin servei a algú o a mi mateix:

  • Insert FTP: This class can be used to manage FTP user accounts stored in a MySQL database.It can connect to a MySQL server that has a database of FTP user accounts used by FTP servers like pure-ftpd. It can: add new user accounts, block an user, change account quotas, retrieve the details of an FTP user account.
  • Karatag Google Maps HTTP Request: The Google Maps API is mostly known for being able to present maps of anywhere in the world in any Web site. However, Google Maps API is also able to provide other interesting features, like determining the geographic coordinates of a given address. This class uses the Google Maps API just for the purpose of determining the location associated to an address from PHP programs.
  • Virtual Cron: Many Web applications need to execute periodical tasks, like sending newsletters, processing pending e-commerce orders, etc. Some operating systems come with programs, like cron or at, to execute scheduled tasks. However, under some Web hosting environments these programs cannot be used. This class provides an alternative solution that can be used in more restricted hosting environments. It uses files to keep track of the last time when a periodical task was executed. The site Web page scripts can use the class to check these files. The class can tell when it is time to execute a task again. When it is time, the same script can execute the scheduled task without depending on external programs.

pfSense: patch pel DynDNS quan la interficie WAN no té la IP pública

Reading time: 2 – 2 minutes

Si pel motiu que sigui, teniu un pfSense que amb el servei de Dynamic DNS i la vostre interficie WAN no té la IP pública amb la que voleu actualitzar el servei d’IP dinàmica que useu aquí trobareu la solució. Això pot passar per diversos motius:

  • Hi ha més d’una WAN
  • La WAN té una IP privada que enllaça amb el router
  • Accés a internet a través d’una VPN
  • etc

Doncs bé, concretament en el meu cas tinc dues sortides WAN i per si fos poc la que té IP dinàmica no té la IP asignada pel proveidor sinó una IP privada. Així doncs, buscant pels foros de pfSense he trobat aquesta solució al problema.

Es tracta de modificar el fitxer /etc/inc/dyndns.class. Primer de tot afegim aquest nou mètode (funció) a la classe:

/* Private function for getting real IP */
/* Author: Tri Tu */
function _checkip() {
   log_error("DynDns: Running _checkip() for real WAN IP");
   $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, 'http://checkip.dyndns.com');
   curl_setopt($ch, CURLOPT_HEADER, 0);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
   $data = curl_exec($ch);
   curl_close($ch);
   list($part1, $part2) = split(': ', $data, 2);
   list($ip, $junk) = split('<', $part2);
   return $ip;
}

Després dins del mateix fitxer busquem tots els llocs on apareix:

$wan_ip = get_current_wan_address();

i ho canviem per:

$wan_ip = $this->_checkip();

Si ús fixeu, el tema és tan senzill com dir-li a la classe que per saber quina és la seva IP de WAN ha de cridar la funció anterior, aquesta funció connecta a la típica web que retorna la IP que tenim i a partir d’aquí capturem aquesta IP i l’assignem a la variable que s’usar per saber si ha canviat la nostre IP.

PHP: com treballar amb fitxers de sistema

Reading time: < 1 minute

No fa gaire vaig publicar un monogràfic sobre els arrays en php. Crec que aquest tipus de monogràfics són molt útil malgrat tinguis molta experiència amb un llenguatge ja que sovint serveixen com una millor manual de referència que l’oficial. Així doncs, ara li toca el torn al tractament de fitxers des de PHP, concretament el monogràfic l’han fet la gent d’IBM. El podeu trobar a The right way to read files with PHP (local html i pdf).

PHP: notes sobre arrays i tres classes (myCurl, barcodes, WSSoapClient)

Reading time: 2 – 3 minutes

A HowtoForge han publicat un howto (local) sobre com funcionen els arrays en PHP que esta molt bé. Realment el que més valoro són les notes sobre les funcions que menys s’acostumen a usar i per tant, les menys documentades o més mal documentades. Tot i que sovint quan les descobreixes ja no pots viure sense elles, funcions de búsqueda, de push, pop, var_dump per depurar, etc.

A més a través de phpClasses he trobat tres classes que els hi he de donar un bon cop d’ull ja que tenen molt bona pinta:

  • MyCurl This class provides an alternative implementation of the cURL extension functions in pure PHP. It automatically detects whether the cURL library is available. If it is not available, it defines several functions with the same names of the cURL extension that use the class to emulate part the original functionality. Currently it implements the functions: curl_init, curl_exec, curl_setopt and curl_close. Several of the most important options can be set with the curl_setopt function.
  • HTML Bar Codes This package can be used to display bar codes using only HTML with CSS styles. It takes a code to represent and generates CSS style definitions and HTML tags to render that code in an HTML page. There are two classes that can render bar codes using the Code39 and Interleave 2 of 5 standards respectively.
  • WSSoapClient This class can add WSSecurity authentication support to SOAP clients implemented with the PHP 5 SOAP extension. It extends the PHP 5 SOAP client support to add the necessary XML tags to the SOAP client requests in order to authenticate on behalf of a given user with a given password. This class was tested with Axis and WSS4J servers.

SOAP amb Symfony

Reading time: 2 – 3 minutes

symfony.gif

Fa uns mesos vaig implementar una aplicació amb força connexions SOAP tan a nivell de client, com de servidor contra aplicacions .NET i aplicacions SOAP fetes en Symfony mateix. Malgrat funcionen prou bé, he de reconeixer que la implementació SOAP de PHP fins a la versió 5.2.0 que és la última que he provat dona alguns problemes. Ja no quan es comunica amb .NET sinó quan parlo amb ella mateixa. Puc assegurar que no és culpa del codi, perquè l’estructura client servidor de la que parlo feia més de 200 transaccions diaries de les quals unes 10 o 20 fallaben, per errors de l’estil Error Fetching http headers. De fet, investigant vaig trobar algún que altre BUG intern de PHP que comentava el problema, però segons deien a PHP ja estava solucionat. Doncs a mi em continuaven donant. Finalment el que vaig fer per solucionar-ho va ser eliminar SOAP a tot arreu d’on vaig poder, ara mateix no tinc ni un error d’aquest estil i es continuen fent unes 200 transacions diaries o més.

Malgrat aquesta no massa bona experiència, continuo pensant que la idea és boníssima i que cal seguir treballant amb ella. Doncs bé, quan vaig implementar el servidor SOAP via Symfony no vaig trobar cap tipus de documentació que parles de com fer-ho bé. Així doncs vaig improvisar i vaig repartir el codi entre les actions i els templates amb tan bon criteri com vaig saber, tan per publicar el fitxer WSDL com per publicar el servei SOAP. Ara esta apunt de sortir la versió 1.0 de Symfony i curiosament també s’ha publicat un snippet on es parla de com publicar un servei SOAP desde Symfony. Així doncs, he de reconeixer que la implementació que es fa de la idea en aquest snippet és molt millor que la meva. Per tant, el recomano: Code Snippets: Soap server (local).

HttpClient – PHP Web Client Class

Reading time: 1 – 2 minutes

Aquesta classe ens permet implementar de forma senzillissima un client HTTP 1.0 i 1.1 tan per peticions GET com POST. De fet, fa algo semblant al que que comentava de la classe de perl WWW:Mechanize tot i que amb molt menys detalls. Malgrat això pot ser molt útil per interactuar amb altres webs des del nostre codi en PHP. A més és senzillissim usar aquesta classe. HttpClient implementa les següent funcionalitats.

  • Implements a useful subset of the HTTP 1.0 and 1.1 protocols.
  • Includes cookie support.
  • Ability to set the user agent and referal fields.
  • Can automatically handle redirected pages.
  • Can be used for multiple requests, with any cookies sent by the server resent for each additional request.
  • Support for gzip encoded content, which can dramatically reduce the amount of bandwidth used in a transaction.
  • Object oriented, with static methods providing a useful shortcut for simple requests.
  • The ability to only read the page headers – useful for implementing tools such as link checkers.
  • Support for file uploads.

Per més informació recomano que mireu els exemples que hi ha a la web de la classe és realment simple d’usar.

phpMailer – una classe de PHP per enviar emails

Reading time: 5 – 8 minutes

En PHP quan s’ha d’enviar un email sovint s’usa la funció mail() tot i que aquesta és una mica limitada en quan a paràmetres que se li poden passar al servidor SMTP. Per exemple, temes d’autenticació i xifrat. Via pear hi ha diverses solucions però a vegades cal que la solució que incorpori el nostre aplicatiu sigui independent d’aquest tipus de requisits de sistema. Així doncs phpMailer ens pot servir per sortir de més d’un embolic.

Suporta:

  • Can send emails with multiple TOs, CCs, BCCs and REPLY-TOs
  • Redundant SMTP servers
  • Multipart/alternative emails for mail clients that do not read HTML email
  • Support for 8bit, base64, binary, and quoted-printable encoding
  • Uses the same methods as the very popular AspEmail active server (COM) component
  • SMTP authentication
  • Word wrap
  • Address reset functions
  • HTML email
  • Tested on multiple SMTP servers: Sendmail, qmail, Postfix, Imail, Exchange, etc
  • Works on any platform
  • Flexible debugging
  • Custom mail headers
  • Multiple fs, string, and binary attachments (those from database, string, etc)
  • Embedded image support

Un petit exemple d’ús perquè vegeu el senzill que és usar-lo:

require("class.phpmailer.php");
$mail = new PHPMailer();
$mail->IsSMTP();                                   // send via SMTP
$mail->Host     = "smtp1.site.com;smtp2.site.com"; // SMTP servers
$mail->SMTPAuth = true;     // turn on SMTP authentication
$mail->Username = "jswan";  // SMTP username
$mail->Password = "secret"; // SMTP password
$mail->From     = "from@email.com";
$mail->FromName = "Mailer";
$mail->AddAddress("josh@site.com","Josh Adams");
$mail->AddAddress("ellen@site.com");               // optional name
$mail->AddReplyTo("info@site.com","Information");
$mail->WordWrap = 50;                              // set word wrap
$mail->AddAttachment("/var/tmp/file.tar.gz");      // attachment
$mail->AddAttachment("/tmp/image.jpg", "new.jpg");
$mail->IsHTML(true);                               // send as HTML
$mail->Subject  =  "Here is the subject";
$mail->Body     =  "This is the <b>HTML body</b>";
$mail->AltBody  =  "This is the text-only body";
if(!$mail->Send())
{
   echo "Message was not sent <p>";
   echo "Mailer Error: " . $mail->ErrorInfo;
   exit;
}
echo "Message has been sent";

Aquesta troballa l’he fet a través de l’article phpMailer , a great Email transfer class del blog de Moody Bahrain.

iCalcreator: classe de PHP per crear fitxers iCal

Reading time: 1 – 2 minutes

ical.png

iCalcreator és una implentació en PHP del RFC2445 que ens permet crear fitxers iCal/xCal. Normalment aquest tipus de fitxers s’usen en sistemes CMS, de gestió de projectes, aplicacions de calendari (p.e. google calendar), agendes, informes, llistes de tasques (ToDos), diaris i d’altres similars.

Aquest implementació de l’RFC2445 es composa només d’un sol fitxer amb una classe. Malgrat segons l’autor ha fet la classe tan senzilla com a pogut ens recomana moltíssim llegir l’RFC2445 i l’RFC2446 per tal de posar-la usar de forma adequada. De totes formes, la pàgina web de la classe també disposa d’un howto que ens serveix per com s’ha d’usar la classe.

L’operador ‘===’ en PHP

Reading time: 2 – 2 minutes

Amb el temps que fa que programo en PHP i mai m’havia trobat amb la necessitat d’usar aquest operador. De fet, el que hauria de dir és que mai m’havia imaginat que existia aquest operador. Segur que tots coneixeu el ‘==’ que simplement serveix per comparar si dos valors són iguals. Doncs bé, la diferència amb el ‘===’ és que es compara que siguin iguals i del mateix tipus. A mi m’ha servit per solucionar un problema molt senzill i que es feia molt complicat.

Per exemple, si tenim un array i fem una búsqueda d’un valor dintre de l’array amb la comanda array_search ens retornarà la clau que identifica la fila de l’array on hi ha el valor que busquem. Però si el valor no es troba en l’array ens retornarà un false. Si volem saber si s’ha trobat o no, podem fer un:

if ( $clau_retornada == false )

El problemilla d’aquest codi és que false és igual a 0 i si la busqueda retorna com a resultat la clau 0 (primera posició d’un array) aquí tindrem una resposta ambigua. Doncs bé si la condició hagués estat:

if ( $clau_retornada === false )

No haguéssim tingut aquest problema, ja que el zero retornat per la funció array_search en el cas de ser una clau hagués tingut un tipus numéric o alfanuméric, però no de tipus boleà. Així doncs, gràcies al operador del que parlem podriem evitar l’ambigüetat del valor retornat per la funció array_search.

Yahoo! bookmarks usa symfony

Reading time: 2 – 2 minutes

yahoobookmarkslogo.jpg

Fa força dies que no parlo de res relacionat amb el symfony, de fet, això és el que té la meva feina que m’he de moure molt ràpid entre tecnologies depenent del projecte. Doncs bé, ni molt menys m’he oblidat d’ell. Però ara més que PHP estic tocant temes de Python, a nivell de programació. De totes formes el que volia comentar aquí és una notícia que he trobat al blog de symfony concretament es comenta que la gent de Yahoo! bookmarks ha escollit aquest framework que l’Oriol i jo ja varem escollir fa uns mesos per un projecte de recàrrega de telèfons mòbils i venta de targetes internacionls que encara tinc pendent de comentar a la web de movilpoint.

Així doncs, notícies com aquestes són les que et fan anar a dormir amb la consciència ben tranquila per les teves decisions. Realment és un plaer veure com gent de nivell tècnic tan contrastat com és l’equip de Yahoo! ens confirmen el que nosaltres ja varem opinar fa una bona colla de mesos. Tot això fa que encara tingui més ganes de que arribi la esperada versió 1.0 d’aquest framework malgrat suposarà força canvis profunds en algunes parts importants del funcionament del mateix i potser haurem de reprogramar parts importants de les nostres aplicacions. Però segur que valdrà la pena fer-ho.