PHP

Hiphop PHP

Tags:

Facebook has been working a lot, Cassandra, Scribe, u name it. The new kid from Facebook is Hiphop PHP which is an automated system that converts PHP to C++

HipHop programmatically transforms your PHP source code into highly optimized C++ and then uses g++ to compile it.

Read More here: HipHop

How sessions work in PHP

Tags:

HTTP is a stateless protocol. Which means that every request the browser makes to the server cant be identified by the server as a subsequent request of that user/IP/browser or a brand new request.

HTTP doesn't understand who is requesting. So how do sessions manage to make HTTP look intelligent? The Answer lies in the request-response model with data.

Scribe PHP logging

Tags:

I'd put some efforts to make scribed logging work with PHP, what I did was follow python's example script "scribe_cat". And made a similar PHP Script out of it, I'd to create many PHP scripts out of n number of .thrift files. Anyways I've got a working example. Here it is.

<?php
/*
 * As found on http://highscalability.com/product-scribe-facebooks-scalable-logging-system
        $messages = array();
        $entry = new LogEntry;
        $entry->category = "buckettest";
        $entry->message = "something very interesting happened";
        $messages []= $entry;
        $result = $conn->Log($messages);
*/

$GLOBALS['THRIFT_ROOT'] = './includes';

include_once $GLOBALS['THRIFT_ROOT'] . '/scribe.php';
include_once $GLOBALS['THRIFT_ROOT'] . '/transport/TSocket.php';
include_once $GLOBALS['THRIFT_ROOT'] . '/transport/TFramedTransport.php';
include_once $GLOBALS['THRIFT_ROOT'] . '/protocol/TBinaryProtocol.php';
//include_once '/usr/local/src/releases/scribe-2.0/src/gen-php/scribe.php';

$msg1['category'] = 'keyword';
$msg1['message'] = "This is some message for the category\n";
$msg2['category'] = 'keyword';
$msg2['message'] = "Some other message for the category\n";
$entry1 = new LogEntry($msg1);
$entry2 = new LogEntry($msg2);
$messages = array($entry1, $entry2);

$socket = new TSocket('localhost', 1464, true);
$transport = new TFramedTransport($socket);
$protocol = new TBinaryProtocol($transport, false, false);
$scribe_client = new scribeClient($protocol, $protocol);

$transport->open();
$scribe_client->Log($messages);
$transport->close();

PHP, Python Consistent Hashing

Tags:

I found out the hashing algorithm used in PHP-Memcache is different from that of Python-Memcache. The keys went to different servers as the hash created by python and php were different.

I posted a question on the memcache groups and was lucky to find this wonderful reply.

import memcache
import binascii
m = memcache.Client(['192.168.28.7:11211', '192.168.28.8:11211
', '192.168.28.9:11211'])

def php_hash(key):
    return (binascii.crc32(key) >> 16) & 0x7fff

for i in range(30):
       key = 'key' + str(i)
       a = m.get((php_hash(key), key))
       print i, a

This is the only thing that has to be done on Python's end, change the way the hash is calculated. The coding on PHP end remains same. All you guys using PHP for web based front-end with MySQL and Python for back-end scripts shall find this helpful.

Thanks Brian Rue.

Reference: http://groups.google.com/group/memcached/msg/7bb75a026c44ec43

Creating a Live Score Board Client Logic

Tags:

The the custom JavaScript object player is defined as below.

function player () {
	
	this.name = '';
	this.serving = false;
	this.gamepoint = 0;
	this.sets = new Array();
	
	this.toString = function() {
		return (this.name + ": " + (this.serving ? 'Serving' : 'Facing') + "\n" + this.sets + "\n" + this.gamepoint);
	}
}

The sets member variable is an array.

Creating a Live Score Board Client Logic

Tags:

Let us start with a script tag that will enclose all the fundooo script. You can save in a .js file as well if you want...

The httpObj is the XMLHttpRequest object, and xmlScore is the response XMLDocument. I've created a player object class which is used by the tplayers variable.

Making a Live Score Board - Client

Tags:

Here comes the cool part now. The client! using the famous XMLHttpRequest

The basic logic of creating the client is this

  • Make asynchronous calls to the server to fetch the match data
  • Parse the XML data
  • Using DOM update the content of the Score board
  • And obviously add a timer to refresh the asynchronous HTTP calls

Creating a Live Score Board

Tags:

Many a times you may have come across a fancy "Live Score Board", recently (as of writing) you may have seen the "Java Applet"ized score board. If you want to have a similar such app, but don't want to get into Java and applets. You may wonder.

But there is a solution, Asynchronous Javascript HTTP Request calls, you may commonly now it AJAX, or famous as XMLHttpRequest

... and make something like
Score board screenshot

You can find working example here, Live Score Board

Building a Tag Cloud (logic)

Tags:

Once we have the data we want, we can build the logic to make the cloud.
Here the logic is extremely simple (no wonder I've made a tutorial about it).

The idea is to assign a minimum font-size in "pt" to the least occured tag. In our case we have taken 8pt. Since this 8pt size is applicable to the XML tag (our example), whose tag count is 3. We need to find a multiplying factor for all the tags, that will give us their respective font sizes.

The multiplying factor should take into account, the tags count, and the total of the tag count, which in turn is the percentage of occurance for that tag. So if the factor is x, tag count is 3, tag count sum is 58 and font size is 8, the equation would be

Building a Tag Cloud

Tags:

You may have come across Del.icio.us Tags, which is commonly referered as a "Tag cloud"
tag cloud