Create ZPKs the Easy Way
Zend Server1 provides the ability to deploy applications to a single server or cluster of servers via the ZPK2 package format. We offer the package zfcampus/zf-deploy3 for creating ZPK packages from Zend Framework and Apigility applications, but how can you create these for Expressive, or, really, any PHP application?
Requirements
To create the ZPK, you need a few things:
- The
zip
binary. ZPKs are ZIP files with specific artifacts. - The
composer
binary, so you can install dependencies. - An
.htaccess
file, if your Zend Server installation is using Apache. - A
deployment.xml
file.
htaccess
If you are using Apache, you'll want to make sure that you setup things like
rewrite rules for your application. While this can be done when defining the
vhost in the Zend Server admin UI, using an .htaccess
file makes it easier to
make changes to the rules between deployments.
The following .htaccess
file will work for many (most?) PHP projects. Place it
relative to your project's front controller script; in the case of Expressive,
Zend Framework, and Apigility, that would mean public/index.php
, and thus
public/.htaccess
:
RewriteEngine On
# The following rule tells Apache that if the requested filename
# exists, simply serve it.
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
# The following rewrites all other queries to index.php. The
# condition ensures that if you are using Apache aliases to do
# mass virtual hosting, the base path will be prepended to
# allow proper resolution of the index.php file; it will work
# in non-aliased environments as well, providing a safe, one-size
# fits all solution.
RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L]
deployment.xml
The deployment.xml
tells Zend Server about the application you are deploying.
What is listed below will work for Expressive, Zend Framework, and Apigility
applications, and likely a number of other PHP applications. The main things to
pay attention to are:
- The
name
should typically match the application name you've setup in Zend Server. - The
version.release
value should be updated for each release; this allows you to use rollback features. - The
appdir
value is the project root. An empty value indicates the same directory as thedeployment.xml
lives in. - The
docroot
value is the directory from which the vhost will serve files.
So, as an example:
<?xml version="1.0" encoding="utf-8"?>
<package version="2.0" xmlns="http://www.zend.com/server/deployment-descriptor/1.0">
<type>application</type>
<name>API</name>
<summary>API for all the things!</summary>
<version>
<release>1.0</release>
</version>
<appdir></appdir>
<docroot>public</docroot>
</package>
Installing dependencies
When you're ready to build a package, you should install your dependencies. However, don't install them any old way; install them in a production-ready way. This means:
- Specifying that composer optimize the autoloader (
--optimize-autoloader
). - Use production dependencies only (
--no-dev
). - Prefer distribution packages (versus source installs) (
--prefer-dist
).
So:
$ composer install --no-dev --prefer-dist --optimize-autoloader
Create the ZPK
Finally, we can now create the ZPK, using the zip
command:
$ zip -r api-1.0.0.zpk . -x api-1.0.0.zpk -x '*.git/*'
This creates the file api-1.0.0.zpk
with all contents of the current directory
minus the .git
directory and the ZPK itself (these are excluded via the -x
flags). (You may want/need to specify additional exclusions; the above are
typical, however.)
You can then upload the ZPK to the web interface, or use the Zend Server SDK4.
Simple example: single-directory PoC
Let's say you want to do a proof-of-concept, and will be creating an index.php
in the project root to test out an idea. You would use the above .htaccess
,
but keep it in the project root. Your deployment.xml
would look the same,
except that the docroot
value would be empty:
<?xml version="1.0" encoding="utf-8"?>
<package version="2.0" xmlns="http://www.zend.com/server/deployment-descriptor/1.0">
<type>application</type>
<name>POC</name>
<summary>Proof-of-concept of a very cool idea</summary>
<version>
<release>0.1.0</release>
</version>
<appdir></appdir>
<docroot></docroot>
</package>
You'd then run:
$ zip -r poc-0.1.0.zpk . -x poc-0.1.0.zpk
Done!
Fin
ZPKs make creating and staging deployment packages fairly easy — once you know how to create the packages. We hope that this post helps demystify the first steps in creating a ZPK for your application.
Visit the Zend Server documentation5 for more information on ZPK structure.
Footnotes
1. http://www.zend.com/en/products/zend_server ↩
2. http://files.zend.com/help/Zend-Server/content/application_package.htm ↩
3. https://github.com/zfcampus/zf-deploy ↩
4. https://github.com/zend-patterns/ZendServerSDK ↩
5. http://files.zend.com/help/Zend-Server/content/understanding_the_application_package_structure.htm ↩