HHVM & Hack: The painless way to get started

So we have heard about the new PHP Virtual Machine from Facebook – HHVM and the static typing flavoured new programming language called “Hack” that comes with HHVM. If you haven’t already, check out hhvm.com and hacklang.org for more details.

Now, if you are on a Linux box, setting up HHVM would seem a little less complicated. But if you are on Windows or Mac OS X, the hell breaks lose. HHVM doesn’t have any support for Windows yet. You can manually compile it on OS X or perhaps use a package manager like Homebrew (which would automate the compilation for you). However, because of some bugs in HHVM, the setup for HHVM 2.4.2 has been failing (as I found out from the homebrew repo pointing to the hhvm bugs) on homebrew. I did have an older version installed but I wanted to go cutting edge. So, I needed a Linux box. If you are on Windows, this is a solution for you as well. I setup a Ubuntu VM to install the latest HHVM. I could just download a 64 bit ISO and install inside VirtualBox but I preferred Vagrant since it’s just easier to setup and use. I am going to walk you through the setup now.

Step – 1: Get Vagrant

Head over to: http://www.vagrantup.com/ and follow the instructions for your OS. It is quite simple. You would need to have VirtualBox installed for Vagrant to work.

Step – 2: Installing and launching the Ubuntu VM

Create a directory somewhere and cd into it.

Let’s create a vagrant configuration file:

This would create a file named “Vagrantfile” which is a configuration file written in Ruby.

Let’s add a box, a box file is basically a VM image and configuration packed in one file. We shall download one of the default box, Ubuntu 12.04 64bit which we would call “precise64”. “Precise Pangolin” was the nickname of Ubuntu 12.04 if you didn’t know. And please note HHVM pre built packages are available for Ubuntu 12.04 64bit, so we can’t go for 32bit here.

(PS: If you have a bad internet connection, download the file using a download manager and then use relative path like: “vagrant box add precise64 ~/Downloads/precise64.box” – that would work as well 😀 )

Now let’s make sure that we told Vagrant to use the newly created “precise64” box as the base of our VM. My Vagrantfile roughly looks like this:

Now, let’s get the VM up:

This should setup the Ubuntu VM and we’re ready for installing the HHVM now 😀

Step – 3: Setting up HHVM

SSH into the box:

You shall be SSH’d into the linux terminal. So you can play around 🙂

Now, we are going to install HHVM from the official repo. Type the following commands one after one to install. Explanation of the commands are available in comments:

If everything goes right, we should have a working HHVM installation!

(The above instructions to setup HHVM on Ubuntu 12.04 were taken and very slightly modified from: https://github.com/facebook/hhvm/wiki/Prebuilt-packages-on-ubuntu-12.04)

Step – 4: Saying Hello!

First, let’s see if HHVM was installed correctly.

So it was installed correctly.

Let’s try some Hack:

Output:

Now, feel free to try out HHVM and Hack along with the many cool things they can do.

Some useful resources:

A sample site: https://github.com/hhvm/hack-example-site

The PHP Manual with Hack references: http://docs.hhvm.com/

Have something to say? Please leave your feedback in the comments section.

Using PhpStorm from Command Line

I know the title is not so interesting because we all know PhpStorm can be launched from the command line just using the “pstorm” command. Like this:

But I love the word “storm” more than “pstorm”, so I did this in my .zshrc:

How do we open a directory in PhpStorm? Just like the usual:

Ah, that will open the current directory in PS 🙂

But what if the command line tool was not installed properly? What if, while upgrading, the tool broke? Or if like me, you install EAPs all the time to try out new features and the command line tool can’t find the EAP version’s path? Well, in this blog post, I will share the python script that is actually installed as the “pstorm” tool. I will also tell you what to modify in case it can’t find your PhpStorm. And of course, we will see how to install it.

So first, the python script. If it’s installed on your system, you can view the content:

Or to edit it with your preferred text editor (in my case vim):

If you don’t have the script installed, here’s mine:

If you know Python, feel free to read and understand what’s actually doing. Now, this script needs to know two things:

— The path to PhpStorm directory (where the executable is)
— The preferences directory

You should be able to find the first trying to locate where PhpStorm is installed. For the second, it’s actually platform dependent. On OS X, it’s inside the “Home” > “Library” > “Preferences” > “WebIde**” directory.

The preference directories are named with a zero appended to the major version of PhpStorm. So, for PS 7.x it’s WebIde70. For 6.x, it’s WebIde60.

Just configure the two variables in the script. Then copy it to your path, in my case, I have “~/.bin” added to my PATH. So I did this:

The last line makes it executable. Now open a new terminal and try the “pstorm” command.

Generators and Coroutines in PHP

If you’re a nerd and would love a very detailed post on Coroutines, here’s one for you – http://nikic.github.io/2012/12/22/Cooperative-multitasking-using-coroutines-in-PHP.html. If you decide to read the above mentioned article, I believe you can safely skip my article below, it doesn’t have anything extra, rather it tries to explain co-routines on a rush.

NOTE: The features of PHP described in this post were introduced on PHP 5.5.0. If you are using an older version, this is not going to work. Please upgrade your PHP version and enjoy the performance bonus with these awesome new additions! 🙂

Before we can start on Coroutines, let’s review our knowledge on Generators. Generators allow us to quickly create iterators which instead of populating a large dataset once, populate each item in turn, one after another. Since one item is produced/returned every turn, it is very memory efficient. In fact you can handle an unlimited stream of data with minimal memory usages using iterators. Let’s see a quick example:

So what does it do? The gen() function returns an iterator of the “Generator” class. (If you look at the manual, Generator class implements the “Iterator” interface and thus we can use foreach on the class).

Internally, when we iterate over the generator object, it starts executing the gen() function. When it hits the yield statement, it pauses execution of the function and returns the value to the generator object (and thus back to our main loop). We then print the value. In the next iteration, the gen() function is resumed from where it was paused and executed until it hits the yield statement again.

Let’s see an example of generator which doesn’t use any loops inside and rather has multiple yield statements. This should help us in better understanding the use of yield in generators.

The above example should explain better how Generators are actually interruptible functions which can be paused and resumed with the yield statement to make iteration possible on the returned values. Now, as long as Generators are concerned, the function returns value. This is a one way communication. But what if we want to send back a value to the function? Coroutines come into play. Coroutines allow two way communication through the “send()” method on a “Generator” class. When we send a value back to the function, yield switches it’s role. Instead of returning a value back to the iteration process, it then receives the value we send into the function. A very plain example to describe this:

What’s happening here? We’re sending a value back and the value is available to the “yield” statement inside the function.

We can return and receive values with the same yield statement. Let’s see how:

Awesome no? Well, Coroutines are definitely complex and sometimes very hard to handle. If you don’t get the concepts at the first look or would love to understand more of the internal implementation, I recommend you read and understand the article I mentioned at the beginning. And do play with it. Have fun!

Multithreading in PHP: Doing it right!

Long ago I wrote a similar post on multi threading in php – http://www.masnun.com/2009/09/07/php-multi-threading.html – which allowed us to fork a new process and execute codes in parallel. While it often served the purpose right, it was not true multi-threading.

I have come across the awesome “pthreads” PECL extension for some time. Tonight, I planned to give it a shot. What sparked my curiosity? Well, let me quote them –

this is not a hack, we don’t use forking or any other such nonsense, what you create are honest to goodness posix threads that are completely compatible with PHP and safe … this is true multi-threading 🙂

True multi-threading in PHP, isn’t that worth wasting a night’s sleep to check out?

Installation

Since it’s a PECL extension, you can just do –

It requires ZTS aka thread safety enabled in PHP. So if your PHP is non-zts, please make sure to recompile with zts. Please consult appropriate docs on your platform on how to do that.

If you’re on OS X and use homebrew php, you can use the “–with-thread-safety” flag to reinstall php with ZTS enabled. Now install the extension and it should work.

Let’s write some codes

Of course, here we go!

The code is pretty straightforward. We extend the Thread class which has an abstract method – “run” which we must implement with our business logic. The codes inside this method actually get executed when the threads run. Then we create 5 instances and call the “start” method. After the threads have started, we again call the “join” method on each. This will ask our main thread to wait for the child threads to return.

As you can see, the main worker threads all output their ID, thus we can identify which one executed when. This could be helpful to determine if they were actually running in threads (and thus being async in nature) or ran one after one.

I got these outputs from several run:

Okay, so looks like it worked. No?

Here’s some helpful links:

Github Repo: https://github.com/krakjoe/pthreads

Manual: http://docs.php.net/manual/en/book.pthreads.php

Laravel 4: Sending Emails

Laravel 4 uses SwiftMailer library behind the stage. They have wrapped the SwiftMailer functionality in elegant and easy to use APIs for delivering emails.

The Mail::send() API is straight forward, it takes these as argument –

# The email template to render. You can pass an array for sending both text and html emails.
# The data array which contains the values for the email template.
# A closure to configure the message. The closure is passed an instance of SwiftMailer and you can use the same set of configuration you can use with SwiftMailer.

Choosing a Mail Transport

Laravel 4 allows easy configuration of the mail transport in app/config/mail.php file. The framework has drivers for smtp, PHP’s mail() function and sendmail. If you have a local smtp server running, choose the smtp driver. Set the host to localhost and port to 25.

Pretend Sending Mail

Laravel4 has a nice feature for testing emails on local machines where you probably don’t have a mail server installed and/or configured. You can switch “pretend” in the above configuration to true or use Mail::pretend(TRUE) before making a call to Mail::send(). This will not try to deliver the mail but make a log in the application log file. You can find the logs files in – “app/storage/logs” directory.

পিএইচপি ৫.৫ – নতুন কি এলো?

গত ২০শে জুন পিএইচপি ৫.৫ রিলিজ পেলেও আপগ্রেড করা হয়ে ওঠেনি । আজ একটু আগে আপগ্রেড করেই ভাবলাম নতুন ফিচারগুলো সম্বন্ধে লিখে ফেলি । তো আসুন দেখে নেই উল্লেখযোগ্য নতুন ফিচারগুলো কি কি ।

#১ – জেনারেটর

আমরা পিএইচপিতে আইটারেটর ব্যবহার করার জন্য এতদিন Iterator ইন্টারফেইস ব্যবহার করে এসেছি । কিন্তু নতুন আসা জেনারেটর সিনট্যাক্স ব্যবহার করে আমরা আইটারেশনটা আরো সহজে হ্যান্ডল করতে পারবো ।

জেনারেটর আসলে কি? জেনারেটর হচ্ছে ফাংশনের মতই কিন্তু ফাংশন একবার মাত্র ভ্যালু রিটার্ন করতে পারে কিন্তু জেনারেটর যতবার খুশি ভ্যালু রিটার্ন করতে পারে yield কিওয়ার্ডটি ব্যবহার করে । জেনারেটর থেকে রিটার্ন করা সব ভ্যালু একটি সিকুয়েন্স হিসেবে থাকে যেটি কিনা আইটারেট করা যায় অন্যসব আইটারেটর (যেমন: এ্যারে) এর মত করেই (যেমন: foreach ব্যবহার করে) । জেনারেটর যেহেতু একটি একটি করে ভ্যালু রিটার্ন করে, সেহেতু সব ডাটা এক সাথে এ্যারে তে রাখার প্রয়োজন পড়ে না । ফলে মোমোরী সেইভ করা সম্ভব । যেমন, range(0,1000000) ব্যবহার করে যদি আমরা একটি এ্যারে তৈরি করি এক মিলিয়ন সংখ্যার, তাহলে তার জন্য আমাদের প্রায় ১০০ মেগাবাইট মেমোরী প্রয়োজন হবে । একই কাজ যদি জেনারেটর ব্যবহার করে করি তবে থিওরেটিক্যালি কখনোই ১ কিলোবাইট এর বেশী মেমোরী ব্যবহারের প্রয়োজন পড়বে না ।

চলুন জেনারেটরের কোড এক্সাম্পল দেখি –

আউটপুট:

#২ – finally ব্লক

পিএইচপিতে আমরা এক্সেপশন হ্যান্ডলিং এর জন্য এতদিন try..catch ব্লক ব্যবহার করে এসেছি । এবার আমরা সেই সাথে পাচ্ছি আরেকটি নতুন ব্লক – finally । এই ব্লক সব সময়ই রান করবে । অর্থাৎ এক্সেপশন থাকুক বা নাই থাকুক এই ব্লক পিএইচপি চোখ বুজে এক্সিকিউট করবে । এই ব্লকের সুবিধাটা কি? ধরুন আপনি try ব্লকে একটি ডাটাবেইজ কানেকশন ওপেন করেছিলেন । এরপর পেলেন একটি এক্সেপশন এবং সেটিকে হ্যান্ডল করলেন কিন্তু ঐ ডাটাবেইজ কানেকশন? ওটা তো বন্ধ করা দরকার, তাই না? এই সুযোগটাই আপনি পাচ্ছেন finally ব্লকে ।

পিএইচপি ম্যানুয়াল থেকেই কোড স্যাম্পল তুলে দেই –

#৩ – পাসওয়ার্ড হ্যাশিং এপিআই

পাসওয়ার্ড হ্যাশিং সহজ করার জন্য এই ভার্সনে এসেছে – password_hash() এবং password_verify() । password_hash ফাংশনটি দুইটি প্যারামিটার নিয়ে কাজ করে – টেক্সট পাসওয়ার্ড, এবং হ্যাশিং এ্যালগরিদম (অনেকগুলো প্রিডিফাইন্ড কনস্টান্ট আছে) ।

উদাহরণ:

আউটপুট:

#৪ – ডিরেফারেন্সিং

এবার এ্যারে এবং স্ট্রিং লিটারেলের বেলায়ও ডিরেফারেন্সিং ফিচার যোগ করা হয়েছে –

#৫ – ক্লাস নেইম রেজুলেশন

ধরুন আপনি কোন একটি নেইমস্পেইস থেকে একটি ক্লাস ইম্পোর্ট করেছেন । এখন যদি আপনার প্রয়োজন হয় ঐ ক্লাস এর নেইমস্পেইস সহ পুরো নামের, তখন কি করবেন? আর বিশেষ করে যদি use…as ব্যবহার করে ক্লাসটিকে অন্য নামে ইম্পোর্ট করা হয় তবে ব্যাপারটি আরো জটিল হয়ে দাড়ায় । এই সমস্যার সহজ সমাধান নিয়ে এসেছে ক্লাস নেইম রেজুলেশন । যেকোনো ক্লাসে class কিওয়ার্ড ব্যবহার করে ফুল নেইম পাওয়া যাবে এভাবে – MyClass::class

আউটপুট:

অন্যান্য পরিবর্তন

অন্যান্য পরিবর্তনের মধ্য আছে –

# foreach লুপে list() ব্যবহার করা যায়
# foreach লুপে নন-স্ক্যালার (স্ট্রিং বা নাম্বার বাদের অন্য টাইপের ভ্যালু) ব্যবহার করা যায়
# OpCache এর মাধ্যমে পার্ফরমেন্স এ ইম্প্রুভমেন্ট

ডিজাইন প্যাটার্ন – ফ্যাক্টরি মেথড

আপডেট:

রিফাত ভাইয়ের সাজেশন অনুসারে দুটো জিনিস যোগ করলাম –

# namespace এর ব্যবহার
# instanceof ব্যাবহার করে নিশ্চিত হওয়া যে রিকোয়েস্ট করা ক্লাস আসলে মিডিয়া ইন্টারফেইস ইম্প্লিমেন্ট করে ।

এমরান ভাইয়ের পরামর্শ অনুসারে ডিজাইন বাই কন্ট্র্যাক্ট এর রেফারেন্স যোগ করলাম ।


ফ্যাক্টরি মেথড প্যাটার্ন এর কাজ তার নাম থেকেই সহজে অনুমান করা যায় । এই প্যাটার্নে একটি ফ্যাক্টরি অবজেক্ট এ একটি মেথড থাকে যার কাজ হচ্ছে আমাদের প্রয়োজনমত অবজেক্ট তৈরি করে দেওয়া । এই অবজেক্টগুলো সাধারণত একই ধরণের হয়ে থাকে । উদাহরণ হিসেবে আমরা ভাবতে পারি একটি কন্টেন্ট ম্যানেজমেন্ট সলিউশন এর কথা (যেমন: ওয়ার্ডপ্রেস, জুমলা কিংবা দ্রুপাল) যেখানে নানা ধরণের কন্টেন্ট থাকে । থাকতে পারে অডিও, ভিডিও কিংবা ফটো । এগুলোকে এক সাথে আমরা মিডিয়া হিসেবে চিন্তা করতে পারি । আবার দেখুন, এই মিডিয়াগুলোর কিছু সাধারণ বৈশিষ্ট্য থাকতে পারে, যেমন: সব মিডিয়ারই একটি পাবলিক URL থাকে, সার্ভারে লোকেশন বোঝানোর জন্য ফাইল পাথ থাকে, মিডিয়ার ফাইল সাইজ থাকে, সেই সাথে থাকে কোনটি কোন টাইপের মিডিয়া । এরকম ক্ষেত্রে আমরা একটি মিডিয়া ইন্টারফেইস তৈরি করে নিবো এবং আমাদের স্বতন্ত্র মিডিয়াগুলো এই ইন্টারফেইস ইম্প্লিমেন্ট করবে । ইন্টারফেইস ব্যবহার করে আমরা অবজেক্টগুলোর সাধারণ আচরণ নির্দিষ্ট করে দিতে পারি । যেমন আমরা সব গুলো অবজেক্টকে বাধ্য করতে পারি একটি getType() মেথড ইম্প্লিমেন্ট করতে যেটা আমাদের বলে দিবে ঐ অবজেক্টটি কোন টাইপের মিডিয়া । ইন্টারফেইসের মাধ্যমে ফরমাল একটি স্ট্রাকচার দাড় করানোর কনসেপ্টটি ডিজাইন বাই কন্ট্র্যাক্ট হিসেবে পরিচিত ।

এরপর আমরা একটি মিডিয়া ফ্যাক্টরি ক্লাস ডিজাইন করবো যার একটি স্ট্যাটিক মেথড থাকবে factory() নামে । এই মেথডে আমরা টাইপ পাস করে দিলে সে আমাদের ঐ টাইপের অবজেক্ট দিবে । স্ট্যাটিক মেথড ব্যবহার করবো যাতে নতুন অবজেক্ট তৈরি করার জন্য ফ্যাক্টরি অবজেক্ট এর কোন ইনস্ট্যান্স তৈরি করা না লাগে । আমরা যাতে সরাসরি MediaFactory::factory() কল করতে পারি সেজন্যই স্ট্যাটিক মেথড ।

আমরা এখন খুব সাধারণ একটি উদাহরণ দেখবো পিএইচপি তে –

এখানে দেখুন, আমাদের একটি Media ইন্টারফেইস আছে যেটি একটি পাবলিক মেথড ডিফাইন করেছে getType() । আমাদের Audio, Video এবং Photo ক্লাস এই ইন্টারফেইসকে ইম্প্লিমেন্ট করেছে নিজের মত করে । MediaFactory ক্লাসের factory() আমাদের কাছে $type প্যারামিটার চায় । টাইপ বলে দিলে সে সেই টাইপের অবজেক্ট তৈরি করে রিটার্ন করে ।

এবার আমরা দেখি কিভাবে আমাদের কোডে এই ফ্যাক্টরি মেথড প্যাটার্ন ব্যবহার করবো –

এখানে আমরা প্রতিবার MediaFactory এর কাছ থেকে আমাদের প্রয়োজনীয় টাইপের অবজেক্ট চেয়ে নিচ্ছি । এই কোডের আউটপুটটা কেমন হবে? আসুন দেখে নেই –

তো, এটাই হলো ফ্যাক্টরি প্যাটার্ন যেখানে একটি ফ্যাক্টরি মেথড আমাদের ফরমায়েশ মত অবজেক্ট তৈরি করে দেয় 🙂