PHP App Development – Zend Framework

At this point of my PHP App Development research, I’ve made a decision to start the project using Zend Framework. During my research, I kept reading that frameworks can help your development immensely. They apparently take a lot of the repetition out of your coding, and generally make development more rapid.

So which framework to chose?

There are a lot to chose from, but the same few kept coming up in my research. Zend and CakePHP were probably the two most highly recommended. I’m no expert at the differences between the two, so I won’t even pretend to list them here. But ultimately I decided to go with Zend, mostly for the reasons listed here.

Installing Zend Framework on Linode VPS

UPDATE: After writing this, I realized that apt-get tends to get behind on updating its Zend package. As of writing this, the latest version of Zend is 1.12.0, and running apt-get installed 1.10.3. To fix the error, I removed the /usr/share/php/libzend-framework-php/Zend/ directory and updated it with the latest version of the Library. To be honest, you should probably just follow this tutorial on installing Zend instead of mine. I will leave this here for my own reference though.

I previously wrote about some of the benefits to Amazon’s AWS hosting, but while I’m still learning new technologies like Zend, I figured it would be best to start learning on my current hosting setup and avoid paying for two plans. Btw, my current plan is a Linode 512 with Ubuntu 10.04 and LAMP.

I spent the last day trying to figure out how to install Zend on Linode. Unfortunately, Zend’s official documentation isn’t great for n00bs. It ended up being really simple to install and get a Hello World created, it just took a long time to find a good tutorial. I finally just got it working, so I thought I should document those steps here:

1. Install Zend on server

This couldn’t be easier. SSH onto your server, and run the following command:

sudo apt-get install zend-framework

That downloads and installs all the necessary components of Zend. I still can’t tell if it installs just the full version of Zend Framework, or if it also installs Zend Server. I can’t even tell you the difference between those two things.

Anyway, this installs a handful of things onto your system. The most important to take note of is a library that should have been installed in the following location:

/usr/share/php/libzend-framework-php/Zend/

We’ll be needing that path here in a minute…

2. Create a project

Now we need to decide where our public website is going to reside, and install all of the necessary Zend components in that location. I happened to have a throw-away URL (we’ll call it mydomain.com) that I’m going to use for development, so I created a directory in the following location where my new website will live:

/srv/www/mydomain.com/tup/

The path is pretty arbitrary (“tup” is short for The Untitled Project), but it should at least be within a sub-directory of /srv/www/ (at least that’s where my default server root is).

So now use the cd command to get to your new directory, and then create the project inside of it:

cd /srv/www/mydomain.com/tup/
zf create project

You will be prompted for a location. Make sure to input the path to the tup directory (or wherever your site is going to be housed).

 Now if you do the command ls -la you should see that Zend added a bunch of stuff in there for you.

3. Include library path

This was the part that kept confusing me. Everywhere I looked, I was instructed to “specify the correct library path” but I had no idea what that meant. There are multiple ways of doing it: adding a new include path to your php.ini file, duplicating the whole library, or creating a symlink to it. Wtf do those mean?

Then I found an awesome YouTube video that cleared everything up. What he shows you is that the new project you just created adds an empty directory called “library”:

/srv/www/mydomain.com/tup/library/

Apparently, this new project installs the basics you’ll need to create a new site, but it doesn’t include the main Zend library files. The main installation we did in step 1 installed those core files in a common location. Remember I told you make note of the Zend library path? We’re about to use that.

First, let me explain the methods we’re NOT going to use to include those files. The php.ini method means that you’re telling php to load those files every time php is used. I have about a half-dozen other sites on my server, none of which use Zend Framework, so it would be a waste to load its libraries every time those sites use php. Then there’s the method of copying that whole Zend library directory, and pasting it into the library directory. The Zend library directory has some 3,000 files taking up nearly 30MB. Duplicating it would unnecessarily waste precious hard-disk space, so I ruled that out.

Instead I created a symlink inside of the library directory and pointed it to the Zend directory. First make sure you’ve cd’ed to library directory, then issue the link command:

cd /srv/www/mydomain.com/tup/library/
ln -s /usr/share/php/libzend-framework-php/Zend/ Zend

So now if you issue a ln -la, it should show you a symbolic link from Zend to the libzend path. We’ve just included the Zend core libraries into our website. Yay!

4. Make it live (add a vhost record)

Now we need to tell Apache to deliver our site by creating a virtual host for this site. If you go to the docs directory in your new project, there’s a README.txt file that has an example VHOST file in it. Copy this content, go to /etc/apache2/sites-available/ and create a new file called mydomain.com. In it, paste the VHOST info Zend provided for you. You might have to make small modifications, but here’s what mine ended up looking like:

    DocumentRoot "/srv/www/mydomain.com/tup/public"
    ServerName mydomain.com
    # This should be omitted in the production environment
    SetEnv APPLICATION_ENV development
     
    <Directory "/srv/www/mydomain.com/tup/public">
         Options Indexes MultiViews FollowSymLinks
         AllowOverride All
         Order allow,deny
         Allow from all
    
     

That “public” directory listed on the second line was created when you created your project, and there should be a default “welcome to zend” index.php file in it. Reload apache with the following command, then navigate to mydomain.com and you should see that index file being displayed.

/etc/init.d/apache2 reload

 

That’s it! At least that’s as far as I’ve gotten so far. We’ll see how it goes from here.