My upcoming PHP talks this fall (2010)

Please join me for my IBM i-focused PHP talks this fall. I’ll present these topics:

  • web services with PHP and Zend Framework
  • batch and command-line tasks with PHP
  • RPG-based 5250 applications as the basis for new web applications

…all focused on PHP on IBM i!

Here are the dates, locations and web sites with more information:

Sept 28: Vermont Midrange Users Group (VTMUG) education day, South Burlington, Vermont

Oct. 3-6: COMMON Fall Conference, San Antonio, Texas

Oct. 26: OMNI Users Group education day, Chicago suburbs

Nov. 1-4: Zend/PHP Conference (ZendCon 2010), Santa Clara, California

I look forward to meeting many of you at these great conferences and education days.

Posted in Announcements, IBM i, iSeries, PHP, SOAP, System i, Web services, Zend Framework | 2 Comments

Two techniques for retrieving SQL from Zend Framework’s database components

Zend Framework’s database components can build and run queries without the developer’s having to touch the underlying SQL. Sometimes, though, developers need the SQL for diagnosing problems or to look for efficiencies. That SQL can be accessed with a choice of two main techniques:

getQuery()

getQuery() is a method of Zend_Db_Profiler and seems, along with getLastQueryProfile(), to be the standard advice for retrieving SQL of a recent query:

query = $profiler->getLastQueryProfile();
echo $query->getQuery();

Yes, getQuery() works, but what if I’m not using the profiler, or I need to retrieve SQL before a query has run?

__toString()

The “magic method” __toString() is simple and can be used either before or after the query is run. When applied to a Zend_Db_Select object, it generates an SQL string.

From the Zend_Db_Select documentation:

$select = $db->select()->from('products');
$sql = $select->__toString();
echo "$sql\n";

// The output is the string:
// SELECT * FROM "products"

__toString() is simple to use, yet is often forgotten when discussing how to retrieve SQL from Zend_Db_Select. I recommend it.

Posted in PHP, Zend Framework | 9 Comments

Maximize Zend Server PHP performance with Apache compression

Does your site run as quickly as it could? It’s worth your time to find out. Faster web sites sell more products, improve user satisfaction, and even rank higher in Google searches.

Note: This tip was written for IBM i but could be adapted for other platforms as well.

Benefits of Zend Server

If you have upgraded from Zend Core to Zend Server for IBM i, you have already received several performance improvements: bytecode acceleration (Zend Optimizer+), the elimination of Zend Core’s proxy web server, and configurable Data Caching. If you upgraded from Community Edition (CE) to full Zend Server, you also get monitoring, Page Caching, and Job Queue functionality.

Compression adds even more speed

IBM’s Apache web server provides an additional way to speed up your Zend Server for IBM i pages. You can compress PHP output, javascript, style sheets, and other text-based content. The compressed output will automatically be decompressed and interpreted properly by all modern web browsers. My tests show a speed improvement of 10-50% from this easy technique.

How to enable compression in 3 steps

1. Edit ZENDSVR’s Apache configuration file, located at /www/zendsvr/conf/httpd.conf. This is a simple text file, so you may choose from several editors: IBM’s HTTP Server Admin GUI at port 2001 (if *ADMIN is started), the WRKLNK/EDTF command, or your favorite text editor (I use EditPad Pro).

2. Add the following two directives to the httpd.conf’s main section:

# Load IBM i's module that performs compression
LoadModule deflate_module /QSYS.LIB/QHTTPSVR.LIB/QZSRCORE.SRVPGM

# Specify what to compress (example: php, json, css, javascript, static html)
AddOutputFilterByType DEFLATE application/x-httpd-php application/json text/css
application/x-javascript application/javascript text/html

3. Restart Zend Server using the handy Restart PHP button button or STRTCPSVR SERVER(*HTTP) RESTART(*HTTP) HTTPSVR(ZENDSVR)

Measure the improvement

I ran before-and-after tests using a sample script included with Zend Server for IBM i: http://your-server:10088/Samples/SQL_access/DB2_SQL_example.php.

Before compression: 31kb, loaded in 250ms (milliseconds). See the Firebug report below (Firebug is an optional add-on for Firefox and is not required.)

Zend Server output without compression

Without compression, this page was 31kb and loaded in 250ms

After compression: 4.4kb; loaded in 109ms. That’s only 14% of the size and 50% of the time! See the screen shot below.

after compression: only 4.4kb and loaded in 109ms

after compression: only 4.4kb and loaded in 109ms

I highly recommend that you give output compression a try. Your Zend Server for IBM i pages will fly!

For more information on browser output compression, see: http://httpd.apache.org/docs/2.0/mod/mod_deflate.html

Posted in Apache, IBM i, iSeries, Performance, PHP, System i, Web development, Zend Framework, Zend Server | Tagged , , , , | 5 Comments

Zend Studio 7.2.1 faster, more reliable

I just upgraded my copy of Zend Studio for IBM i from 7.0.2 to 7.2.1. Big improvement!

My use case: I typically use Zend Studio’s “Remote Server” facility to connect to the IBM i over FTP. With 7.2.1, FTP-based files now open and save much faster than before. In addition, the FTP connection no longer randomly disconnects the way it used to.

I recommend upgrading to 7.2.1, especially for anyone using FTP. It provides a smooth, hassle-free user experience.

Get Zend Studio here: http://www.zend.com/en/products/studio/downloads. Scroll down to the edition you need.

Note: this product is still free to users of IBM i, a nice benefit of Zend’s relationship with IBM.

Posted in IBM i, iSeries, PHP, System i, Zend Studio | 2 Comments

A simple security measure

A reader recently asked me this security question:

If a user enters:

http://<my_ip>/<mydirectory>

instead of

http://<my_ip>/<mydirectory>/script.php

They get a listing of all scripts/files in that directory and they can then select and execute/run those scripts.

This is a real concern for us, any suggestions?

The solution is to turn off directory browsing in your Apache configuration. To do this, make sure your Apache configuration file (probably httpd.conf or .htaccess) includes this directive:

Options -Indexes

Note that this directive merely prevents people from discovering the names of your files. Users who already know your file names can still access them. But Options -Indexes provides an important layer of security, preventing mischief from casual users who might otherwise stumble onto your file names by accident or design.

More information: http://httpd.apache.org/docs/2.2/mod/core.html#options

Posted in Apache, PHP, Web development | 2 Comments

See me speak about web services and Zend Framework

Join me at at Long Island PHP on June 7, 2010, where I’ll present a case study showing how I integrated Windows-based data into an IBM i-based application using SOAP with Zend Framework.

The principles are the same no matter what type of servers you use.

Event details: http://www.listnet.org/eventDetails.cfm?eventID=1263

There will be plenty of time for questions and discussion.

Hope to see you there!

P.S. To see the slides from my past presentations, go to  http://www.alanseiden.com/presentations/.

Posted in Announcements, IBM i, PHP, SOAP, System i, Web services, Zend Framework | 1 Comment

Differences Between Zend Core and Zend Server on IBM i

Zend Server for IBM i improves upon Zend Core’s older implementation of PHP in numerous ways. To make the migration easier, I’ve created a table that shows some of the settings and default file locations that have changed between Zend Core and Zend Server.

Zend Core
Zend Server
Installation folder
/usr/local/zend/core
/usr/local/zendsvr
PHP.INI
/usr/local/zend/core/etc
/usr/local/zendsvr/etc
Web server root(s)
/www/zendcore,
/usr/local/zend/apache2
/www/zendsvr
Document root
/www/zendcore/htdocs
/www/zendsvr/htdocs
Zend Framework
/usr/local/Zend/ZendFramework
/usr/local/zendsvr/share/ZendFramework
PHP binaries folder *
* where php and php-cli reside
/usr/local/zend/core/bin
/usr/local/zendsvr/bin
PHP Log files
/usr/local/zend/core/logs
/usr/local/zendsvr/
var/log
Web user profile (assign authority to it)
NOBODY
QTMHHTTP
Default HTTP Port
:89
:10088
Admin Interface URL
http://yourIBMi:89/ZendCore/
http://yourIBMi:10088/ZendServer/
Menu (5250)
GO ZENDCORE/ZCMENU
GO ZENDSVR/ZSMENU

If the new HTTP port of 10088 seems hard to remember, you can change it to something that’s easier to work with, such as the standard HTTP port of 80. To do that, edit /www/zendsvr/conf/httpd.conf and change Listen *:10088 to Listen *:80 or whatever you want. (Of course, first ensure that no other service is running on that IP/Port combination.)

Posted in IBM i, PHP, System i, Web development, Zend Server | 6 Comments

Zend Server for IBM i Is Here

Zend and IBM have announced an updated, streamlined version of their PHP package for IBM i, called Zend Server. I’ve been using the beta for a while but last week read an announcement showing it’s ready for general use. It combines the best of Zend Core and Zend Platform in one package.

To get Zend Server, go to the Zend Server for IBM i page and click the green “Free Download” button. This will give you the “Community Edition (CE)” version, the free version that handles all the basics for running PHP on IBM i. It even comes with a year of free online support.

If you want to  upgrade to the non-CE version (it doesn’t have its own name), which gives you more debugging and tracing tools, as well as Job Queue functionality and more support, you can buy a license. Write to me if you need help or want to buy a license for the non-CE version.

Posted in IBM i, PHP, System i, Web development, Zend Server | Leave a comment

PHP for Batch Tasks on IBM i

Last night I gave a talk at the FASUG user group about how to use PHP as a powerful general utility language that can be called from CL programs on the IBM i. I also showed how Zend Server’s new Job Queue feature can accomplish similar goals–scheduling and automating PHP scripts–using a pure PHP interface rather than CL.

I also discussed the IBM i’s latest PHP package: Zend Server for IBM i. I explained its similarities to and differences from Zend Core.

Here are the PowerPoint slides.

Posted in Uncategorized | 1 Comment

Class ‘Zend_Db_Table’ not found

New developers sometimes struggle with putting all of Zend Framework’s pieces together. This week someone asked me how to resolve the error:

Fatal error: Class ‘Zend_Db_Table’ not found.

The answer: he needs to “require” the file containing the Zend_Db_Table class, like so:

require_once 'Zend/Db/Table.php';

or (my preference) use the autoloader:

// ZF 1.8 or later: add these lines to your bootstrap file:
require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance()->setFallbackAutoloader(true);

ZF isn’t complicated if you know the few things you MUST use. The autoloader is one of them.

If you need help getting started with Zend Framework, contact me about Zend Framework mentoring, training, or troubleshooting.

Posted in IT, PHP, Web development, Zend Framework | 1 Comment