Archive

Archive for the ‘php’ Category

Php Acronym Replace

May 25th, 2008

Χρειαζόμουν ένα acronym replace utility για να το ενσωματώσω σε ένα site. Όπως κάθε έξυπνος προγραμματιστής, ψάχνει πρώτα στο google. Τι γίνεται όμως όταν αυτό που βρίσκει δεν τον ικανοποιεί. Προσπαθεί να το φτιάξει μόνος του.

Έτσι λοιπόν ξεκίνησα να σκέφτομαι τι θα μπορούσα να χρησιμοποιήσω ώστε να πετύχω το καλύτερο δυνατό αποτέλεσμα. Στην αρχή σκέφτηκα να κάνω parse το html, να βρίσκω τα κείμενα ανάμεσα στα tags, και να κάνω replace τα acronyms. Άκυρη η προσπάθεια, πολλά προβλήματα, ήθελε πολλούς ελέγχους. Αποφάσισα ότι πρέπει να κινηθώ προς αυτήν την κατεύθυνση, άλλα με άλλο τρόπο parsing.

Έτσι μου ήρθε η ιδέα να χρησιμοποιήσω τον xml parser του php module expat. Το αποτέλεσμα καταπληκτικό, απλά έπαιρνε υπόψη του, μόνο το πρώτο block από tags. Έπρεπε να βρω γιατί σταματούσε, και δεν συνέχιζε και στα επόμενα. Μετά από ώρες ψαξίματος, κατάλαβα ότι του έλειπε ένα dtd, για να καταλάβει ο parser με τι τύπο xml (doctype) έχει να κάνει.

Έτσι του πρόσθεσα ότι είναι xhtml. Bingo επιτέλους πάρσαρε όλα τα blocks που είχε το content. Βέβαια τα προβλήματα δεν σταμάτησαν εδώ, ενώ έδειχναν ότι όλα είναι ok, ξαφνικά διαπίστωσα ότι χαρακτήρες όπως &,.! κτλ, εξαφανίστηκαν. Άντε πάλι googling… Η λύση ήρθε από το W3C, λείπανε τα entities, από το dtd. Πρόσθεσα και τα entities που με ενδιαφέρανε και το αποτέλεσμα, super! Τέλος για γίνει καλύτερο, πρόσθεσα στα replace όλες τις περιπτώσεις με τα σημεία στίξης. Με ένα σύστημα cache, για μεγαλύτερη ταχύτητα, το replace για τα acronyms έπαιξε καταπληκτικά, καλύπτοντας όλες τις περιπτώσεις που είχα στο site.

Με αυτό το utility κατάφερα εκτός των άλλων, να κατασκευάσω και ένα μικρό xhtml validator, γιατί αν υπάρχει έστω και ένα πρόβλημα στο html, βρίσκει το error ο parser, και σταματάει η εκτέλεση του. Αυτό το utility, το χρησιμοποιήσαμε στην Netwerk και προσθέσαμε στο cms μας την δυνατότητα για inner linking.

Καθώς έγγραφα το post σκεφτικά, δεν βάζω το utility στo phpclasses ? http://www.phpclasses.org/browse/package/4599.html

php

Site verification over mod_rewrite or error 404 redirect

May 6th, 2008

Ένας τρόπος για να ελέγχεις αν ανήκει ένα domain σε κάποιον, είναι να του ζητήσεις να βάλει ένα αρχείο (zero byte) στον docroot του site του, όπως γίνεται στο google html verification. Αυτό είναι εύκολο να το ελέγξεις με php χρησιμοποιώντας την fopen ή την fsockopen. Τι γίνεται όμως αν υπάρχει rewrite module για να έχει friendly urls (seo) ή error 404 με redirect σε κάποια άλλη σελίδα (παλιά τεχνική – σήμερα αποφεύγεται για διάφορους λόγους). Σε αυτές τις δύο περιπτώσεις, χωρίς να υπάρχει το αρχείο, ο έλεγχος θα βρίσκει ότι υπάρχει. Η λύση είναι πολύ απλή, ανοίγουμε το connection και διαβάζουμε τα raw data. Αν δεν υπάρχει η σελίδα το connection θα αποτύχει. Αν όμως πετύχει το connection τότε θα πρέπει να μην υπάρχουν καθόλου raw data.

function url_valid($url) {
	$found=true;
	$fp=@fopen($url,"r");
	if ($fp) {
		if (fgetc($fp)) $found=false;
		fclose($fp);
	} else
		$found=false;
	return $found;
}

mod_rewrite, php ,

How to create thumbs with mod_rewrite, php and gd2

May 2nd, 2008

Σε συνεργασία με τον Παρασκευά Σμυρλάκη, υπεύθυνο του τμήματος Seo Development της εταιρείας Netwerk, σκεφτήκαμε ένα έξυπνο τρόπο για να φτιάχνεις thumbs on the fly σε μία gallery από φωτογραφίες. Εκμεταλλευτήκαμε τις δυνατότητες του mod rewrite, για να ελέγχουμε αν υπάρχει το thumb αρχείο στον δίσκο, και αν δεν υπάρχει να το κατευθύνουμε σε ένα php script που με την σειρά του το δημιουργεί.

Ποιο συγκεκριμένα έχουμε μία σελίδα που θέλουμε να δημιουργήσουμε ένα thumb στο html δίνουμε απλά την διαδρομή του thumb <img src=”/photos/thumb/demo.jpg” />.

Αυτό που χρειάζεται είναι ένα .htaccess στο folder thumb με το παρακάτω.

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) /thumb.php?ph=$1&w=100&h=100&q=70 [L,QSA]

Για όσους δεν το καταλάβανε, ελέγχουμε αν είναι file ή folder με τα RewriteCond και αν δεν είναι το κατευθύνουμε με RewriteRule στο thumb.php με παραμέτρους το $ph το όνομα του αρχείου και $w & $h το μέγεθος του thumb και $q την ποιότητα του jpeg.

Το php script thumb.php κατασκευάζει το thumb μεγέθους ($w x $h), χρησιμοποιώντας το php extension για gd2. Διαβάζει από το /photos/normal/ την μεγάλη φωτογραφία δημιουργεί το thumb και το αποθηκεύει στον φάκελο /photos/thumb/ με το όνομα που έχει περάσει στην μεταβλητή $ph. Επειδή αυτό το script τρέχει μέσα από το img tag, επιστρέφει με header για jpeg και τα raw data του thumb.

<?php
header("Content-type: image/jpeg");
$imNormal=ImageCreateFromString(file_get_contents("photos/normal/".$_GET['ph']));
$imThumb=ImageCreateTrueColor($_GET['w'],$_GET['h']);
ImageCopyResampled($imThumb,$imNormal,0,0,0,0,$_GET['w'],$_GET['h'],ImageSX($imNormal),ImageSY($imNormal));
ImageJpeg($imThumb,"photos/thumbs/".$_GET['ph'],$_GET['q']);
ImageJpeg($imThumb,"",$_GET['q']);
ImageDestroy($imNormal);
ImageDestroy($imThumb);
?>

Εμείς πάντως κάναμε ένα ακόμα βήμα παραπέρα, και με δύο .htaccess καταφέραμε κάτι ακόμα ποιο advanced. Το αφήνω στην φαντασία σας.

mod_rewrite, php

Nusoap persistent connection

April 30th, 2008

Ένας από του ελληνικούς καταλόγους που θέλω να καταχωρεί αυτόματα το seo tool είναι και το topsites.gr. Για μένα είναι ο καλύτερος ελληνικός κατάλογος, αλλά δεν είναι ο δημοφιλέστερος. Το topsites.gr το έχει ένας φίλος, ο Νίκος Παπανώτας, ο οποίος μου επέτρεψε να φτιάξω ένα web service, για να το χρησιμοποιήσω για την καταχώριση των web sites.

Ξεσκονίζοντας τους κώδικες για τα web service θυμήθηκα ένα πρόβλημα που είχα συναντήσει με τον smart-publisher, ένα open source project που έχω αναπτύξει και ανήκει στην εταιρεία netwerk την οποίας τυχαίνει να είμαι ένα από τα ιδρυτικά στελέχη της. Ο smart-publisher είναι μια web based εφαρμογή σε php οι οποία βρίσκει τις διαφορές σε αρχεία & database (mysql), ανάμεσα σε ένα development και σε ένα production server και τις κάνει upload. Η επικοινωνία μεταξύ των δύο servers γίνεται με web service. Επειδή το web service αυτό μεταφέρει μεγάλη πληροφορία, για να κάνει το compare και στην συνέχεια το publish, ανοίγει πολλαπλά connections με αποτέλεσμα κάποια από αυτά να κλείνουν δημιουργώντας προβλήματα. Αυτό οφείλεται στο γεγονός ότι μπορεί να κοπεί η σύνδεση είτε από το firewall (πχ. προστασία για dos attack) στον server είτε από ένα cisco συστημένο έτσι, ώστε να προσφέρει αυξημένη προστασία στο client.

Για τα web service χρησιμοποιώ το Nusoap project, και την λύση στο παραπάνω πρόβλημα την έδωσα προσθέτοντας στο soapclient μεγαλύτερο χρόνο ανταπόκρισης στα sockets (timeout & response timeout) και κρατώντας το ίδιο connection (HTTP Persistent Connection).

Nosoap Definition:
function soapclient($endpoint,$wsdl = false,$proxyhost = false,$proxyport = false,$proxyusername = false, $proxypassword = false, $timeout = 0, $response_timeout = 30)

Πριν:
$SoapClient=new soapclient($endpoint);

Μετά:
$SoapClient=new soapclient($endpoint, false, false, false, false, false, 10, 600);
$SoapClient->useHTTPPersistentConnection();

nuSOAP, php

Pass cookie to header location with curl

April 25th, 2008

Ξεκίνησα να φτιάξω ένα seo tool για να μπορώ να καταχωρώ ένα web site σε πολλούς ελληνικούς καταλόγους μέσα από μία μόνο φόρμα. Μέχρι τώρα αυτό που έκανα, και φαντάζομαι και πολλοί άλλοι, είναι να καταχωρώ το web site σε κάθε κατάλογο ξεχωριστά.

Σκέφτηκα λοιπών να συνδέομαι με curl στις φόρμες που έχουν το καθένα για την προσθήκη web site, και να σώζω το cookie ώστε να μπορώ να το χρησιμοποιήσω στην συνεχεία, στο submit. Πολλά από αυτά όμως έχουν captcha. Στην αρχή είπα να ψάξω να βρω κάποιο open source project με ocr για να μπορέσω να σπάσω τα captcha. Πάνω στην ερευνά μου βρήκα κάποια project που όμως δεν με ενθουσίασαν και πολύ (Pwntcha, Php Captcha Decoder).

Ένας φίλος, ο Νίκος Παπανώτας ιδρυτής του webdigity ένα community από webmasters, μου πρότεινε ένα πολύ καλό web site που έχει ένα api για captcha decoder το Captcha Killer. Αν και θα μπορούσα να το χρησιμοποιήσω, γιατί το δοκίμασα και παίζει πολύ καλά, (ο τύπος έβγαλε και μπλουζάκια), τελικά κατέληξα σε μια ιδέα που είχα να φέρω τα captcha image urls και να τα δείχνω στη δικιά μου φόρμα.

Αυτό είναι και το θέμα του post. Πως μπορείς να χρησιμοποιήσεις το curl έτσι ώστε να διαβάσει το cookie από τον header και να το στείλει απ΄ ευθείας στην επόμενη σελίδα, που υπάρχει στο header location. Περισσότερες λεπτομέρειες για τον php κώδικα βρήκα στα user comments στο επίσημο web site του php.

Αυτό που χρειάζετε είναι μια function που διαβάζει τον header, βρίσκει τα cookie και τα ξαναστέλνει στο curl, πριν αυτό τελειώσει. Αυτό ορίζετε με την εντολή
curl_setopt($ch,CURLOPT_HEADERFUNCTION,’read_header’).
Για να περάσουμε απευθείας στην σελίδα που υπάρχει στο header location χρησιμοποιούμε την εντολή curl_setopt($ch,CURLOPT_FOLLOWLOCATION, true).
Έτσι τα αποτελέσματα που θα πάρουμε από το curl θα είναι το html της σελίδας μετά το redirect.

Μόλις τελειώσει αυτό το tool θα ανακοινώσω το url που θα βρίσκεται γιατί θα είναι free.

cURL, php , , ,