Pages

Tuesday, March 25, 2014

A simple tutorial

Here we would like to show the very basics of HHVM in a short, simple tutorial. This text only deals with dynamic web page creation with HHVM, though HHVM is not only capable of creating web pages. See the section titled What can PHP do for more information.
HHVM-enabled web pages are treated just like regular HTML pages and you can create and edit them the same way you normally create regular HTML pages.

What do I need?

In this tutorial we assume that your server has activated support for HHVM and that all files ending in .php are handled by HHVM. On most servers, this is the default extension for Hack and PHP files, but ask your server administrator to be sure. If your server supports HHVM, then you do not need to do anything. Just create your .php files, put them in your web directory and the server will automatically parse them for you. There is no need to compile anything nor do you need to install any extra tools. Think of these HHVM-enabled files as simple HTML files with a whole new family of magical tags that let you do all sorts of things.
Let us say you want to save precious bandwidth and develop locally. In this case, you will want to install a web server, such as » Apache, and of course » PHP. You will most likely want to install a database as well, such as » MySQL.
Our manual has installation instructions for HHVM. If you have problems with installing HHVM yourself, we would suggest you ask your questions on our » HHVM IRC channel. It is easy to setup a web server with HHVM support on Linux. On Linux, you may find » rpmfind and » PBone helpful for locating RPMs. You may also want to visit » apt-get to find packages for Debian.

Your first HHVM-enabled page

Note:
Hack and HTML code do not mix. Normally you can intersperse PHP and HTML code together in the same file like:
<html>
 <head>
  <title>PHP Test</title>
 </head>
 <body>
 <!-- hh and html do not mix -->
 <?php echo '<p>Hello World</p>'; ?> 
 </body>
</html>
This code works fine in HHVM. You may jump in and out of Hack mode in an HTML file like this anywhere you want. But if you replace the <?php with <?hh, the code above will not work.
Create a file named hello.php and put it in your web server's root directory (DOCUMENT_ROOT) with the following content:
Example #1 Our first HHVM script: hello.php
<?hh echo '<h1>Hello World</h1>';
Use your browser to access the file with your web server's URL, ending with the /hello.php file reference. When developing locally this URL will be something like http://localhost/hello.php or http://127.0.0.1/hello.php but this depends on the web server's configuration. If everything is configured correctly, this file will be parsed by PHP and the following output will be sent to your browser (with an h1 emphasis):
Hello World
This program is extremely simple and you really did not need to use HHVM to create a page like this. All it does is display: Hello World using the HHVM echo statement. Note that the file does not need to be executable or special in any way. The server finds out that this file needs to be interpreted by HHVM because you used the ".php" extension, which the server is configured to pass on to HHVM. Think of this as a normal HTML file which happens to have a set of special tags available to you that do a lot of interesting things.
If you tried this example and it did not output anything, it prompted for download, or you see the whole file as text, chances are that the server you are on does not have HHVM enabled, or is not configured properly. Ask your administrator to enable it for you using the Installation chapter of the manual. If you are developing locally, also read the installation chapter to make sure everything is configured properly. Make sure that you access the file via http with the server providing you the output. If you just call up the file from your file system, then it will not be parsed by PHP. If the problems persist anyway, do not hesitate to use our » HHVM IRC channel for support.
The point of the example is to show the special Hack (or could have been PHP) tag format. In this example we used<?hh to indicate the start of a Hack tag. Then we put the Hack statement. Closing ?>> tags are not supported in Hack, and generally omitted in newer PHP code. For more details, read the manual section on the basic PHP syntax.
Note: A Note on Line Feeds
Line feeds have little meaning in HTML, however it is still a good idea to make your HTML look nice and clean by putting line feeds in. A linefeed that follows immediately after a closing ?> will be removed by HHVM. This can be extremely useful when you are putting in many blocks of PHP code or include files containing PHP code that aren't supposed to output anything. At the same time it can be a bit confusing. You can put a space after the closing ?> to force a space and a line feed to be output, or you can put an explicit line feed in the last echo/print from within your PHP block.
Now that you have successfully created a working HHVM script, it is time to create a more useful HHVM script! Make a call to the phpinfo() function and you will see a lot of useful information about your system and setup such as availablepredefined variables, loaded PHP modules, and configuration settings. Take some time and review this important information.
Example #2 Get system information from HHVM
<?hh 
phpinfo
();
 

Something Useful

Let us do something more useful now. We are going to check what sort of browser the visitor is using. For that, we check the user agent string the browser sends as part of the HTTP request. This information is stored in a variable. Variables always start with a dollar-sign in Hack and PHP. The variable we are interested in right now is$_SERVER['HTTP_USER_AGENT'].
Note:
$_SERVER is a special reserved PHP variable that contains all web server information. It is known as a superglobal. See the related manual page on superglobals for more information.
To display this variable, you can simply do:
Example #1 Printing a variable (Array element)
<?hhecho $_SERVER['HTTP_USER_AGENT'];
A sample output of this script may be:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36
There are many types of variables available in HHVM. In the above example we printed an Array element. Arrays can be very useful.
$_SERVER is just one variable that HHVM automatically makes available to you. A list can be seen in the Reserved Variables section of the manual or you can get a complete list of them by looking at the output of the phpinfo()() function used in the example in the previous section
You can put multiple statements inside a Hack or PHP tag and create little blocks of code that do more than just a single echo. For example, if you want to check for Chrome you can do this:
Example #2 Example using control structures and functions
<?hhif (strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome') !== FALSE) {
    echo 
'You are using Chrome.<br />';
}
A sample output of this script may be:
You are using Chrome.
Here we introduce a couple of new concepts. We have an if statement. If you are familiar with the basic syntax used by the C language, this should look logical to you. Otherwise, you should probably read the PHP Language Reference or theHack Language Reference parts of the manual.
The second concept we introduced was the strpos()() function call. strpos() is a function built into HHVM which searches a string for another string. In this case we are looking for 'Chrome' (so-called needle) inside$_SERVER['HTTP_USER_AGENT'] (so-called haystack). If the needle is found inside the haystack, the function returns the position of the needle relative to the start of the haystack. Otherwise, it returns FALSE. If it does not return FALSE, the ifexpression evaluates to TRUE and the code within its {braces} is executed. Otherwise, the code is not run. Feel free to create similar examples, with if, else, and other functions such as strtoupper() and strlen(). Each related manual page contains examples too. If you are unsure how to use functions, you will want to read both the manual page on how to read a function definition and the section about HHVM functions.
We can take this a step further and show you a bit more complicated control flow:
Example #3 Mixing both HTML and HHVM (and PHP and Hack) modes
<?hhif (strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome') !== FALSE) {
  echo 
"strpos() must have returned non-false. You are using Chrome";
} else {
  echo 
"strpos() must have returned false. You are not using Chrome";
}

Dealing with Forms

One of the most powerful features of HHVM is the way it handles HTML forms. The basic concept that is important to understand is that any form element will automatically be available to your PHP scripts. Please read the manual section on Variables from external sources for more information and examples on using forms with HHVM. Here is an example HTML form:
Example #1 A simple HTML form
<form action="action.php" method="post">
 <p>Your name: <input type="text" name="name" /></p>
 <p>Your age: <input type="text" name="age" /></p>
 <p><input type="submit" /></p>
</form>
There is nothing special about this form. It is a straight HTML form with no special tags of any kind. When the user fills in this form and hits the submit button, the action.php page is called. In this file you would write something like this:
Example #2 Printing data from our form
<?hh echo "Hello ";
echo 
htmlspecialchars($_POST['name']);
echo 
". You are ";
echo (int)
$_POST['age'];
echo 
" years old";
A sample output of this script may be:
Hi Joe. You are 22 years old.
Apart from the htmlspecialchars() and (int) parts, it should be obvious what this does. htmlspecialchars() makes sure any characters that are special in html are properly encoded so people can't inject HTML tags or Javascript into your page. For the age field, since we know it is a number, we can just convert it to an integer which will automatically get rid of any stray characters. You can also have HHVM do this for you automatically by using the filter extension. The$_POST['name'] and $_POST['age'] variables are automatically set for you by HHVM. Earlier we used the$_SERVER superglobal; above we just introduced the $_POST superglobal which contains all POST data. Notice how the method of our form is POST. If we used the method GET then our form information would live in the $_GETsuperglobal instead. You may also use the $_REQUEST superglobal, if you do not care about the source of your request data. It contains the merged information of GET, POST and COOKIE data. Also see the import_request_variables()function.

No comments:

Post a Comment