PHP i wielowątkowość

Jak powszechnie wiadomo, PHP nie udostępnia mechanizmów na poziomie języka do pisania wielowątkowych aplikacji. W dzisiejszych czasach popularność aplikacji internetowych wciąż rośnie i warto zainteresować się wielowątkowym przetwarzaniem danych w języku PHP.

Dzięki pakietowi ZendX_Console_Process_Unix w frameworku Zend Framework możliwe jest pisanie aplikacji, które po stronie serwera wykorzystają kilka wątków.

Klasa ta nakłada pewne ograniczenia co do serwera:

  • system operayjnego serwera musi to być system bazujący na Unixie, tj. Linux, Solaris, Mac/OSx itp.
  • serwer musi mieć zainstalowane moduły: shmop_*, pcntl_*, posix_*

Zainteresowanych wielowątkowością, odsyłam do dokumentacji Zend Frameworka: ZendX_Console_Process_Unix

Jeśli masz jakieś uwagi – zapraszam do komentowania!

Curl – pobieranie plików z Apache realm

Ostatnio zdarzylo mi się, że pliki które miał pobrać mój skrypt PHP, były umieszczone na serwerze z autentykacją Apache realms.

Skrypt w postaci:

$fp = fopen( $fileName, "w+");
if( $fp ) {
	$ch = curl_init( $url.'?password=mojeHaslo&login=mojLogin' );
	curl_setopt($ch, CURLOPT_FILE, $fp);
	curl_setopt($ch, CURLOPT_HEADER, 0);
 
	curl_exec($ch);
	curl_close($ch);
	fclose($fp);
}

nie zadziała.

Należy dodać do curl 2 opcje, i całość skryptu będzie wyglądać tak:

$fp = fopen( $fileName, "w+");
if( $fp ) {
	$ch = curl_init( $url );
	curl_setopt($ch, CURLOPT_FILE, $fp);
	curl_setopt($ch, CURLOPT_HEADER, 0);
	curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
	curl_setopt($ch, CURLOPT_USERPWD, 'mojLogin: mojeHaslo');
 
	curl_exec($ch);
	curl_close($ch);
	fclose($fp);
}

Safari 4 – recenzja

KIlka dni temu zainstalowałem nową wersję przeglądatki internetowej od firmy Apple: Safari 4, w wersji beta. Z nieukrywaną ciekawością uruchomiłem aplikacje i zostałem bardzo mile zaskoczony.

Safari 4 beta

Pierwsza rzecz jaka mnie dała się odczuć, to dosyć duże przyśpieszenie działania (renderowania stron www). Natrafiłem nawet na porównanie prędkości działania z innymi przeglądarkami (link). W porównaniu tym Safari wypada wręcz rewelacyjnie, choć konkurenci (FireFox i Opera) radzą sobie nie najgorzej.

Bardzo przyjemny dla użytkownika jest widok po otwarciu nowej karty (funkjonalność znana jest fanom Opery):
Safari 4 beta.

Co najważniejsze, według mnie, jest całkowita zdawalność testu ACID3.

safari-aciid3

Jeśli chodzi o stabilność, to przeglądarka działa wyśmienicie. Chciałbym, aby inne firmy produkujące oprogramowanie pisały tak stabilne wersje beta swoich dzieł!!! Safari działa u mnie non stop, kilka otwartych okien, masa zakładek i działa stabilnie, bardzo stabilnie.

Serdecznie zachęcam do instalacji i do testów nowej wersji Safari.

Wygląd strony www pod różnymi przeglądarkami

Zastanawialiście się kiedyś, jak wygląda wasza strona pod przeglądarkami, których nie macie zainstalowanych u siebie na komputerze? Poniżej zamieszczam linki, do darmowych narzędzi, dzięki którym możecie to sprawdzić 🙂

http://browsershots.org/

http://ipinfo.info/netrenderer/index.php

http://browsrcamp.com/

Zend Framework – Validator dla potwierdzenia hasła, emaila itp

Przy pracy nad pewnym projektem opartym o Zend Framework, zaistniała potrzeba walidacji elementów formularza, tak, by zawartość jednego elementy była identyczna jak innego, np hasło i jego potwierdzenie. Aby tego dokonać wystarczy stworzyć prosty walidator:

class Validate_Confirm extends Zend_Validate_Abstract {
	/**
	 *
	 * @var Zend_Form_Element
	 */
	protected $_matchedField;
 
	/**
	 *
	 */
	const NOT_CONFIRMED = 'notConfirmed';
 
	/**
	 *
	 * @var array
	 */
	protected $_messageTemplates = array(
			self::NOT_CONFIRMED => 'notConfirmed'
		);
 
	/**
	 *
	 * @param Zend_Form_Element $matchedField
	 */
	public function __construct( Zend_Form_Element $matchedField ) {
		$this->_matchedField = $matchedField;
	}
 
	/**
	 *
	 * @param $value
	 * @return boolean
	 */
	public function isValid( $value ) {
		if( $this->_matchedField->getValue()==$value ) {
			return true;
		} else {
			$this->_error( self::NOT_CONFIRMED );
			return false;
		}
	}
 
}

następnie taki walidator używamy w naszym formularzu:

class Form_User_Register extends Zend_Form {
 
	/**
	 * (non-PHPdoc)
	 * @see library/Zend/Zend_Form#init()
	 *
	 * sets the form inputs
	 */
	public function init() {
		$el = new Zend_Form_Element_Text( 'email' );
		$el->setLabel('Email');
		$el->addValidator( new Zend_Validate_EmailAddress() );
		$el->setRequired( true );
		$this->addElement($el);
 
		$el = new Zend_Form_Element_Password( 'password' );
		$el->setLabel('password');
		$el->setRequired( true );
		$this->addElement($el);
 
		$el2 = new Zend_Form_Element_Password( 'passwordConfirmation' );
		$el2->setLabel('confirmPassword');
		$el2->addValidator( new Validate_Confirm( $el ) );
		$el2->setRequired( true );
		$this->addElement($el2);
 
		$el = new Zend_Form_Element_Submit( 'signup', array('class'=>'ui-state-default ui-corner-all') );
		$el->setLabel('registerMe');
		$this->addElement($el);
	}
}

Dzięki takiemu zabiegowi nasz formularz sam sprawdzi, czy odpowiednie pola są sobie równe.