alanseiden.com
Alan Seiden Consulting
Bring RPG/COBOL business
logic to the web

with the PHP Toolkit
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Alan’s PHP on IBM i focus
• Consultant to innova...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Founder, Club Seiden
3
club.alanseiden.com
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Contact information
4
Alan Seiden
alan@alanseide...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Today’s toolkit topics
• A key component of mode...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting


Toolkit connects
PHP to the i
6
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Access traditional ‘i’ resources from PHP
• Call...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Testimonial
• “PHP and its IBM i Toolkit have en...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Call RPG/COBOL: adapt 5250 logic to the web
9
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Screen #1, Order header
10
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Screen #2, Order detail
11
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Screen #3, Content package from detail
(Option 4...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Screen #4, Notes from order detail
F9 key launch...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Web page combines all 4 “green screens”
14
RPG, COBOL,
System Resoures
PHP Application
Stored proc
Db2 calls
If we used stored procedures
Stored proc
Stored proc
Sto...
RPG, COBOL,
System Resources
XMLSERVICE
Your PHP code
Toolkit
Toolkit Methods
Sends XML
Toolkit architecture (no extra obj...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
XMLSERVICE
17
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Toolkit’s back-end: “XML Service”
• An IBM open ...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
XML Service architecture
• Cross platform, acces...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Toolkit
20
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Collaborative
• Free and Open Source Software (F...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
A few of our contributors so far
22
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Is it really free?
• Yes!
§ BSD license (busine...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Toolkits shipped by Zend (then and now)
• 2006-2...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
PHP toolkit talks to XMLSERVICE
• PHP talks to X...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting


Install and
configure
26
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Several ways to get toolkit
• Zend Server
• Offi...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Zend Server for IBM i
• Download Zend Server 8.x...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Get current PTFs within your release
•Latest DB2...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
New versions on YiPs
• Young i Professionals (Yi...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
“Bleeding edge” also on YiPs
• Test versions of ...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
YiPs installation location
• Choose XMLSERVICE i...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
GitHub is latest home to the toolkit
• Front-end...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Verify installation: run demo scripts
§ Deploy ...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting


Program calls
35
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Calling demo script with result
Call_program_RPG...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
RPG program from ZENDSVR samples
File: ZENDSVR/Q...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
PHP to call it
/www/zendsvr/htdocs/Samples/Toolk...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
AddParameterChar in detail
AddParameterChar() is...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
More parameter types
AddParameterChar($io, $size...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Additional program call features
•PCML parameter...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Common question
•“My RPG data structures are com...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
New RPG-to-PHP parameter mapping tool
•http://yi...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Paste the RPG code
44
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Voila…parameters in PHP
45
•Creates perfect para...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting


Commands
46
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Several ways to call commands
$conn->CLCommand(‘...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Simple command
// CLCommand to add library list ...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Interactive command output
$cmdString = ‘DSPLIBL...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Results of DSPLIBL
Array
(
[0] => 5770SS1 V7R1M0...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Get info with RTV* commands
CLCommandWithOutput(...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Output from RTVJOBA
Array of job attributes
Arra...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting


More examples
53
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
List of output queues
54
// includes ToolkitServ...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Output queue display
55
by var_dump’ing $outqNam...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Array of data structures
56
•See example here: h...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Read a data area
57
require_once(‘iToolkitServic...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting


Connecting
58
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Basic connection
• Connect with database, user, ...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Choice of stateless or stateful (private)
• Easi...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting


Safety first
61
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Prevent RPG/COBOL errors from hanging
• “Message...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
1. Wrap program in CL having MONMSG
• Wrap RPG/C...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
2. Toolkit timeout technique
// give RPG/COBOL 1...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
3. Set a global reply via System reply list
• CH...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting


Resources, events,
Q&A
66
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Resources
• Alan’s toolkit page with links to ot...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Try the toolkit and get to web/mobile
68
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
A community resource: get involved
• Help us enh...
alanseiden.com
Alan Seiden Consulting
PHP Toolkit for IBM i
technical details
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
To check XMLSERVICE version
call qp2term
qsh -c ...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
How to use persistent DB2 connection
• See “DB2 ...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Useful settings in toolkit.ini
• Located in /usr...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
How to check or set CCSID
• DSPSYSVAL QCCSID
•If...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting


Connect from

“off the box”
75
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
2-tier = Run PHP on Windows/Linux/Mac
• A common...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Alternatives for 2-tier transports
• DB2 Connect...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Connect via ODBC
• First, set up ODBC database c...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
HTTP transport
• HTTP/CGI interface, no drivers ...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting


Performance
“do”s and “don’t”s
80
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Performance “don’t”s
• Don’t use disconnect() un...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Performance “do”s
• Do use the proper connection...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting


Troubleshooting
83
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Retrieve error code and message
• getErrorCode()...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Troubleshooting tips
• Get latest toolkit versio...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Z-Ray will speed development
• Shows every query...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Interactively debug RPG or COBOL program
1. Add ...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting


Future of toolkit
88
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
The latest
• PHP toolkit version 1.6.1 / XMLSERV...
PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting
Contact and get tips
Alan Seiden
Alan Seiden Con...
Upcoming SlideShare
Loading in...5
×

PHP Toolkit from Zend and IBM: Open Source on IBM i

34,682

Published on

PHP developers on IBM i have a new way to access resources such as RPG and COBOL programs, system commands, data areas, and more, using a new, free, flexible, open source toolkit, supported by Zend. Using IBM's XMLSERVICE toolkit on the back end, it's all open source, enabling a high level of quality and functionality delivered by Zend, IBM, and IBM i community members who take the initiative.

You will learn:

• How your older PHP applications can use the new toolkit with minimal changes, thanks to the Compatibility Wrapper (CW), developed for Zend by Alan

And how to:
• Optimize performance
• Develop PHP on your laptop (Windows, Linux) or in the "cloud" and deploy to the IBM i

With suggestions for:
• Security
• Troubleshooting
• Tips and tricks to work with your IBM i in new ways

Published in: Technology
2 Comments
2 Likes
Statistics
Notes
  • Hi, Robert,

    The toolkit is still there. Any Toolkit folders under htdocs were old, anyway. The real toolkit under 5.6 was in /usr/local/zendsvr/share/ToolkitAPI. Under Zend Server 6, the folder is /usr/local/zendsvr6/share/ToolkitAPI, which should be included in your include_path in php.ini.

    Alan
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Hi Alan...I just did an install of the new PHP stack from Zend (ZendSvr6, 5.4) on my iSeries...I just opened the htdocs folder and Im not seeing any of the 'old' toolkit folders...nor am I seeing any of the new ones either! (XMLService?)....So how do I RPG programs with the latest verson of Zend Server? Thanks,
    Robert Engelhardt
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
34,682
On Slideshare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
85
Comments
2
Likes
2
Embeds 0
No embeds

No notes for slide

PHP Toolkit from Zend and IBM: Open Source on IBM i

  1. 1. alanseiden.com Alan Seiden Consulting Bring RPG/COBOL business logic to the web
 with the PHP Toolkit
  2. 2. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Alan’s PHP on IBM i focus • Consultant to innovative IBM i and PHP users • PHP project leader, Zend/IBM Toolkit • Contributor, Zend Framework DB2 enhancements • Award-winning developer • Authority, web performance on IBM i 2
  3. 3. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Founder, Club Seiden 3 club.alanseiden.com
  4. 4. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Contact information 4 Alan Seiden alan@alanseiden.com 201-447-2437 alanseiden.com twitter: @alanseiden
  5. 5. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Today’s toolkit topics • A key component of modernization on IBM i • How the toolkit came to be • Who and how? § Open source on IBM i? Yes! § Community project
 • Install/configure/use • Program and command calls • Performance • Tips, troubleshooting, resources 5
  6. 6. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting 
 Toolkit connects PHP to the i 6
  7. 7. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Access traditional ‘i’ resources from PHP • Call RPG, COBOL, CL § Including IBM i APIs § Most popular use of toolkit
 • Commands § ADDLIBLE LIB(MYLIB) § More command types (details later)
 • Read/write objects that store data § Data areas § User spaces • Send/receive data queues • Get lists, read data or attributes from these: § Spooled files § Job logs § Active jobs § Objects § System values 7
  8. 8. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Testimonial • “PHP and its IBM i Toolkit have enabled modern web development with rich, complex user interfaces while retaining our business logic on the back end • “We have sent and received parameters with CL, RPG and COBOL programs. We have also leveraged the CLCommand function to submit jobs, manipulate library lists, retrieve job logs and more. • If there are limits, we have not encountered any, and it performs very well.
 —Stephanie Rabbani, senior web developer, BCD 8
  9. 9. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Call RPG/COBOL: adapt 5250 logic to the web 9
  10. 10. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Screen #1, Order header 10
  11. 11. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Screen #2, Order detail 11
  12. 12. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Screen #3, Content package from detail (Option 4 from order header) 12
  13. 13. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Screen #4, Notes from order detail F9 key launches this 13
  14. 14. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Web page combines all 4 “green screens” 14
  15. 15. RPG, COBOL, System Resoures PHP Application Stored proc Db2 calls If we used stored procedures Stored proc Stored proc Stored proc Stored proc Capabilities of stored procs
  16. 16. RPG, COBOL, System Resources XMLSERVICE Your PHP code Toolkit Toolkit Methods Sends XML Toolkit architecture (no extra objects) Also parses data structures and more
  17. 17. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting XMLSERVICE 17
  18. 18. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Toolkit’s back-end: “XML Service” • An IBM open source project for IBM i • Written in RPG • Like a generic stored procedure § Avoid hassle of creating individual stored procedures § Works via XML passed to/from it § Can handle complex data structures easily • Tony Cairns, IBM Rochester 18
  19. 19. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting XML Service architecture • Cross platform, accessible by all languages • Expects parameters defined in XML § PHP toolkit handles the XML 
 <pgm name='ZZCALL' lib='MYLIB'> <parm><data type='1A'>a</data></parm> <parm><data type='1A'>b</data></parm> <parm><data type='7p4'>11.1111</data></parm> <parm><data type='12p2'>222.22</data></parm> <parm><ds> <data type='1A'>x</data> <data type='1A'>y</data> <data type='7p4'>66.6666</data> <data type='12p2'>77777.77</data> </ds> </parm> <return><data type='10i0'>0</data></return> </pgm> 19
  20. 20. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Toolkit 20
  21. 21. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Collaborative • Free and Open Source Software (FOSS) § Source code is there—read it, learn, extend, give feedback § Open source on IBM i appeals to young developers • Community involvement § People are contributing enhancements and fixes (PHP and RPG code). Luca Zovi, Martin Hieden. Tell us your ideas 21
  22. 22. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting A few of our contributors so far 22
  23. 23. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Is it really free? • Yes! § BSD license (business friendly) • http://en.wikipedia.org/wiki/BSD_licenses § Source code available to all • Community code contributions welcome • Inner workings of toolkit revealed—nothing hidden § Fast problem resolution...sometimes in hours 
 • No registration or special license required § (Zend Server itself does require at least a free license)
 • Never a “nag” message § Your QSYSOPR message queue can relax 23
  24. 24. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Toolkits shipped by Zend (then and now) • 2006-2011: i5 Toolkit (Easycom) § No longer shipped with Zend Server § May still be used if already installed § Remains available commercially from Aura company • 2012+: Open Source Toolkit § Made of pure PHP and RPG, free and open source § Functionality similar to i5 Toolkit § Includes a Compatibility Wrapper (CW), developed by me, to ease transition to new toolkit 24
  25. 25. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting PHP toolkit talks to XMLSERVICE • PHP talks to XMLSERVICE through generic stored procedures (installed automatically)
 • Any environment that can send/ receive XML can use XMLSERVICE 
 • PHP was the first major “client” to use XMLSERVICE but others are here now (e.g. PowerRuby, Node.js, .NET), strengthening XMLSERVICE as a back-end 25 RPG, COBOL, System Resources XMLSERVICE PHP Application Toolkit Toolkit Methods XML, Stored Procedures
  26. 26. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting 
 Install and configure 26
  27. 27. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Several ways to get toolkit • Zend Server • Official, tested release packaged in Zend Server
 • Young i Professionals (YiPs) site •Various levels of testing done •Install from source code • Github (PHP front-end only) • Details coming up 27
  28. 28. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Zend Server for IBM i • Download Zend Server 8.x • http://www.zend.com/en/products/server/downloads-ibmi • Easy upgrade from 6.x • Includes latest approved toolkit • Requires IBM i 6.1 and up
 
 
 
 
 • Editions • http://www.zend.com/en/products/server/editions • Basic (free), Professional, Enterprise • Same download, different license 28
  29. 29. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Get current PTFs within your release •Latest DB2 for IBM i group PTF level for your release § 6.1: WRKPTFGRP SF99601 § 7.1: WRKPTFGRP SF99701 § 7.2: WRKPTFGRP SF99702 § For the latest levels: 
 http://www-947.ibm.com/systems/support/i/fixes/
 and click Group PTFs 29
  30. 30. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting New versions on YiPs • Young i Professionals (YiPs) site •http://youngiprofessionals.com/wiki/XMLSERVICE •Install from source code •Two parts: RPG and PHP • Installation instructions are on the site 30
  31. 31. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting “Bleeding edge” also on YiPs • Test versions of XMLSERVICE § “For brave and helpful only” § Rapid releases to resolve issues or add functionality § http://174.79.32.155/wiki/index.php/XMLSERVICE/XMLSERVICETesting • Look under
 “Active test versions” 31
  32. 32. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting YiPs installation location • Choose XMLSERVICE installation library •CRTXML compiles into XMLSERVICE test library • If use test library, configure with toolkit.ini’s “XMLServiceLib” •CRTXML2 compiles into ZENDSVR production library •CRTXML6 compiles into ZENDSVR6 production library • Standard directory for PHP toolkit code •/usr/local/zendsvr(6)/share/ToolkitApi •“zendsvr6” for Zend Server 6.x 32
  33. 33. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting GitHub is latest home to the toolkit • Front-end PHP part of toolkit is now managed on Github • Community can enter issues, submit pull requests, add examples • Composer and Packagist…getting close! • https://github.com/zendtech/IbmiToolkit 33
  34. 34. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Verify installation: run demo scripts § Deploy the sample scripts: • http://files.zend.com/help/Zend-Server-IBMi/content/ i5_installing_sample_scripts_ibmi.htm 34
  35. 35. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting 
 Program calls 35
  36. 36. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Calling demo script with result Call_program_RPG.html Click “Call program” to pass parameter to PHP and then RPG 36
  37. 37. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting RPG program from ZENDSVR samples File: ZENDSVR/QRPGLESRC Member: COMMONPGM C *ENTRY PLIST C PARM CODE 10 C PARM NAME 10 ****************************************************** C CODE IFEQ '1' C movel 'IBM' name C ELSE C CODE IFEQ '2' C movel 'Zend' name C ELSE C movel 'wrong code' name C ENDIF C ENDIF C* C SETON LR C RETURN 37
  38. 38. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting PHP to call it /www/zendsvr/htdocs/Samples/Toolkit/Call_RPG_example.php Call_RPG_example.php 38
  39. 39. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting AddParameterChar in detail AddParameterChar() is defined in ToolkitService.php I / O Le ng th C o m m en t V ar n a m e Ini t va l function AddParameterChar(
 $io, $size, $comment, $varName = '', $value, $varying, $dimension) Our example: 39
  40. 40. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting More parameter types AddParameterChar($io, $size, $comment, $varName, $value, $varying, $dimension) AddParameterInt16($io, $comment, $varName, $value, $dimension) [5i0 ints] AddParameterInt32($io, $comment, $varName, $value, $dimension) [10i0 ints] AddParameterInt64($io, $comment, $varName, $value, $dimension) AddParameterUInt32($io, $comment, $varName, $value,$dimension) AddParameterUInt64($io, $comment, $varName, $value, $dimension) AddParameterFloat($io, $comment, $varName, $value, $dimension) AddParameterReal($io, $comment, $varName, $value, $dimension) AddParameterPackDec($io, $length, $scale, $comment, $varName, $value, $dimension) AddParameterZoned($io, $length, $scale, $comment, $varName, $value, $dimension) AddParameterBin($io, $size, $comment, $varName, $value,$dimension) AddDataStruct(array $parameters, $name='struct_name', $dim, $by, $isArray, $labelLen) 40
  41. 41. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Additional program call features •PCML parameter definitions (optional) •Complex data structures •Arrays and output counter fields •Service programs, procedures, return values 41
  42. 42. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Common question •“My RPG data structures are complex. Is there a shortcut to creating the PHP parameters?” •“I am a PHP developer. I don’t understand the RPG data types. My RPG programmer doesn’t know how to explain.”
 •The solution is here! 42
  43. 43. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting New RPG-to-PHP parameter mapping tool •http://yips.idevcloud.com/Samples/DSpecTool/ •Creates PHP code based on D Specs •Open source: https://bitbucket.org/inext/xmlservice-rpg 43
  44. 44. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Paste the RPG code 44
  45. 45. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Voila…parameters in PHP 45 •Creates perfect parameters, including any procedure name •You may have to adjust the order for data structures
  46. 46. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting 
 Commands 46
  47. 47. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Several ways to call commands $conn->CLCommand(‘my command’); $conn->CLInteractiveCommand(‘DSP.... command’); $conn->CLCommandWithOutput(‘RTV... command’); Details ahead... 47
  48. 48. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Simple command // CLCommand to add library list entry $cmdString = ‘ADDLIBLE LIB(ALANLIB)’; $success = $conn->CLCommand($cmdString); if($success) { echo ‘Added library’; } else { echo ‘Error: ’ . $conn->getErrorMsg(); } 48
  49. 49. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Interactive command output $cmdString = ‘DSPLIBL’; // CLInteractiveCommand returns “screen” results $liblArray = $conn->CLInteractiveCommand ($cmdString); if($liblArray) { // output full result of DSPLIBL command in an array // <pre> </pre> formats the array echo '<PRE>' . print_r($liblArray, true) . '</PRE>'; } Results on next slide... 49
  50. 50. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Results of DSPLIBL Array ( [0] => 5770SS1 V7R1M0 100423 Library List 3/19/12 8:52:44 Page 1 [1] => ASP [2] => Library Type Device Text Description [3] => QSYS SYS System Library [4] => QSYS2 SYS System Library for CPI's [5] => QHLPSYS SYS [6] => QUSRSYS SYS System Library for Users [7] => DBU80 SYS [8] => QSYS38 SYS [9] => DC@EPC03 USR EPC-814 DC@ADKPGM [10] => ZENDSVR USR [11] => QGPL USR General Purpose Library [12] => QTEMP USR [13] => * * * * * E N D O F L I S T I N G * * * * * ) 50
  51. 51. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Get info with RTV* commands CLCommandWithOutput() gets output from RTVJOBA, RTVOBJD, RTVUSRPRF... public function getJobAttributes() { // Note: specify (?N) for numeric attributes $cmdString = 'RTVJOBA JOB(?) USER(?) NBR(?) CURUSER(?) SYSLIBL(?) CURLIB(?) USRLIBL(?) LANGID(?) CNTRYID(?) CCSID(?N) DFTCCSID(?N)';
 // Send command; get output array of key/value pairs $outputArray = $this->ClCommandWithOutput($cmdString);
 return $outputArray; } //(public function getJobAttributes()) $attrs = $conn->getJobAttributes(); // run command echo ‘<pre>’ . print_r($attrs, true) . ‘</pre>’; // print_r() formats arrays Results on next slide... 51
  52. 52. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Output from RTVJOBA Array of job attributes Array(
 [JOB] => QSQSRVR
 [USER] => QUSER
 [NBR] => 240164
 [CURUSER] => QTMHHTTP
 [SYSLIBL] => QSYS QSYS2 QUSRSYS [CURLIB] => *NONE
 [USRLIBL] => QTEMP QGPL MYUTIL
 [LANGID] => ENU
 [CNTRYID] => US
 [CCSID] => 37
 [DFTCCSID] => 37 ) 52
  53. 53. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting 
 More examples 53
  54. 54. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting List of output queues 54 // includes ToolkitService.php as well require_once('iToolkitService.php'); // connect to toolkit $conn = ToolkitService::getInstance('*LOCAL', '', ''); $conn->setOptions(array('stateless' => true)); // instantiate our object-finder object. $objectList = new ObjectLists($conn); // getObjectList returns an array. Each element is a 30-char string. // 10 chars for object name; 10 for library; 10 for type. $outqItems = $objectList->getObjectList('*ALL', '*ALL', '*OUTQ'); // Parse the name and library. $outqNameLibs = array(); foreach ($outqItems as $outqItem) { $nameAndLib['name'] = substr($outqItem, 0, 10); $nameAndLib['lib'] = substr($outqItem, 10, 10); $outqNameLibs[] = $nameAndLib; } //(foreach ($outqItems as $outqItem))
  55. 55. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Output queue display 55 by var_dump’ing $outqNameLibs
  56. 56. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Array of data structures 56 •See example here: http://forums.zend.com/viewtopic.php? f=113&t=105248 •Important snippets here: // Subfields for data structure // Here's a character field array, size 3, that's part of the DS $ds[] = $conn->AddParameterChar('both', 21,'Part', 'PTPRT', ‘’) ->setParamDimension(3); // three records // DSCOUNT is a counter field. Value is set by RPG/COBOL program. Value will control the number of MULTDS fields that return (see data structure MULTDS below) $param[] = $conn->AddParameterZoned('both', 5, 0, 'how many MULTDS array elements actually return', 'DSCOUNT', 6)->setParamLabelCounter('DSCOUNT'); // Multi-occurrence data structure with maximum dimension set to 100 but whose final output count will be determined by DSCOUNT. field names arbitrary. Name them whatever you wish $param[] = $conn->AddDataStruct($ds, 'MULTDS') ->setParamDimension(100) // max of 100 records ->setParamLabelCounted('DSCOUNT');
  57. 57. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Read a data area 57 require_once(‘iToolkitService.php’); // set up name of data area $dataAreaObj = new DataArea($ToolkitServiceObj); $dataAreaObj->setDataAreaName('MYLIB', 'MYDTAARA'); // read it $value = $dataAreaObj->readDataArea(1, '*ALL'); // offset and length // output string value from data area echo $value;
  58. 58. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting 
 Connecting 58
  59. 59. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Basic connection • Connect with database, user, password • Try *LOCAL or real database name • WRKRDBDIRE shows valid names • If leave blank (‘’, ‘’, ‘’): connect with default web user • QTMHHTTP
 59 <?php // bring in the toolkit require_once('ToolkitService.php'); // connect to local IBM i $conn = ToolkitService::getInstance('*LOCAL', 'MYUSER', ‘MYPASS’);
 // specify stateless mode (simple: no internal key needed) $conn->setOptions(array('stateless'=>true));
  60. 60. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Choice of stateless or stateful (private) • Easiest way to start: stateless § Quicker initial connection, runs tookit directly in DB2 job (QSQSRVR job) § No guarantee that you’ll get same job from pool § Share QTEMP between SQL and RPG (runs in DB2 job) § Specify ‘stateless’ $conn=>setOptions(array(‘stateless’=>true)); • Advanced: stateful/private § A new job is started and “reserved” for re-use § Retains file cursors (READE position), QTEMP, LIBL, open file handles § Best performance when many program calls § Specify ‘InternalKey’ as unique job identifier $conn=>setOptions(array(‘InternalKey=>‘/tmp/jim123’));
 60
  61. 61. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting 
 Safety first 61
  62. 62. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Prevent RPG/COBOL errors from hanging • “Message waiting” Inquiry messages are to be avoided • It seems “normal” for errors to pop up in a green screen • “Record lock,” “Add more records to file?” “Level check” • Find them with DSPMSG MSGQ(QSYSOPR) MSGTYPE(*INQ) • If an RPG/CL does not complete, it won’t return control • Web page will “hang” till it times out or operator ends job • If operator ends job, further requests may go nowhere • Three techniques coming up—aside from not allowing faulty programs in production 62
  63. 63. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting 1. Wrap program in CL having MONMSG • Wrap RPG/COBOL call in a CL (control language) program containing a MONMSG statement. Example: PGM PARM(&PGMNAME &ERRORFL) DCL &PGMNAME *CHAR 10 DCL &ERRORFL *CHAR 1 /* if any error, end and return error code ‘1’ */ CALL PGM(&PGMNAME) MONMSG CPF0000 EXEC(GOTO $ERROR) CHGVAR &ERRORFL '0' RETURN $ERROR: CHGVAR &ERRORFL '1' ENDPGM 63
  64. 64. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting 2. Toolkit timeout technique // give RPG/COBOL 15 seconds to complete before we give up and end the program, so that PHP doesn't 'hang'. $options = array('stateless' => true, 'customControl' => '*call(15/kill/server)'); $conn->setOptions(array($options)); 64
  65. 65. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting 3. Set a global reply via System reply list • CHGJOB INQMSGRPY(*SYSRPYL) • WRKRPYLE, ADDRPYLE 65
  66. 66. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting 
 Resources, events, Q&A 66
  67. 67. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Resources • Alan’s toolkit page with links to other resources • http://alanseiden.com/toolkit
 • Young i Professionals site • http://youngiprofessionals.com/wiki/XMLSERVICE
 • Zend Toolkit Forum • http://forums.zend.com/viewforum.php?f=113 • “PHP on IBM i”->”Zend Server for IBM i”->”New Toolkit” • Zend toolkit manual • http://files.zend.com/help/Zend-Server-IBMi/zend- server.htm#php_toolkit_xml_service_functions.htm • Github site • https://github.com/zendtech/IbmiToolkit 67
  68. 68. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Try the toolkit and get to web/mobile 68
  69. 69. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting A community resource: get involved • Help us enhance the toolkit § Report any issues on the Forum
 • Contribute enhancements, tips, fixes § Write to forum or alan@alanseiden.com • Why? § Make the toolkit and IBM i platform better for everyone § Sharpen your skills; work with great people J § Working with open source demonstrates commitment to your chosen platform and your career as a whole 69
  70. 70. alanseiden.com Alan Seiden Consulting PHP Toolkit for IBM i technical details
  71. 71. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting To check XMLSERVICE version call qp2term qsh -c /qsys.lib/zendsvr6.lib/xmlver.pgm returns something like: XML Toolkit 1.9.1$ Make sure it’s at least 1.8.5. Critical bug was fixed in 1.8.0. (If the “xmlver” program not found, your XMLSERVICE is too old!) 71
  72. 72. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting How to use persistent DB2 connection • See “DB2 and PHP Best Practices on IBM i” • Persistent DB connection § $conn = ToolkitService::getInstance(‘*LOCAL’, ‘myuser’, ‘mypw’, ‘’, true); § Fifth param is persistence flag § Or re-use an existing DB2 persistent connection // connect to db. Make sure i5 naming mode matches between DB2 and toolkit $namingMode = DB2_I5_NAMING_ON; // ON or OFF $db = db2_pconnect('DBNAME', 'user', 'pass', array('i5_naming' => $namingMode)); // Connect to Zend API, passing db resource and i5 naming mode instead of dbname/ user/password. $conn = ToolkitService::getInstance($db, $namingMode); 72
  73. 73. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Useful settings in toolkit.ini • Located in /usr/local/zendsvr(6)/share/ToolkitApi • Useful settings: •[system] • Debug=true • Creates debug.log • XMLServiceLib = "ZENDSVR6“ • Or = “XMLSERVICE” • Lets you try new versions safely 73
  74. 74. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting How to check or set CCSID • DSPSYSVAL QCCSID •If not 65535, you’re probably OK •Change with CHGSYSVAL SYSVAL(QCCSID) VALUE(xyz) • or in Apache config: /www/zendsvr(6)/conf/httpd.conf •USA settings: • DefaultFsCCSID 37
 CGIJobCCSID 37 •Different outside of USA. Check list of “Job CCSID”: • http://www-03.ibm.com/systems/i/software/globalization/default_list.html 
 • Everyone must set a CCSID •This really means YOU.....otherwise toolkit will not work •I mean it J • P.S. Please set your CCSID 74
  75. 75. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting 
 Connect from
 “off the box” 75
  76. 76. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting 2-tier = Run PHP on Windows/Linux/Mac • A common developer request • Develop on laptop § Connect to XMLSERVICE on IBM i; then deploy PHP code to IBM i with no code changes • Or run production PHP on non-i machine, calling IBM i- based RPG, commands, etc. • Never a charge or cost for this 2-tier support § All free and open source 76
  77. 77. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Alternatives for 2-tier transports • DB2 Connect and ODBC § “DB2 Connect” software from IBM (paid software) • Advantage: handles SQL queries, too, as if they were local to PC § No-charge alternative: ODBC (free with IBM i Access) • Other alternatives § CGI/HTTP (no drivers needed) § Many more are possible because XML can be sent over any type of connection 77
  78. 78. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Connect via ODBC • First, set up ODBC database config on your PC § Connection name will be used as the db name (*LOCAL is not allowed) § Documentation: http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/ index.jsp?topic=%2Frzaii%2Frzaiiodbc04.htm • New API style connection $conn = ToolkitService::getInstance(‘MYODBCCONN’, ‘myuser’, ‘mypw’, ‘odbc’); • CW style connection § Specify database name in toolkit.ini [hosts] myibmi = MYODBCCONN 
 // PHP to connect via ODBC $options = array(CW_TRANSPORT_TYPE=>’odbc’); $conn = i5_connect(‘myibmi’, ‘myuser’, ‘mypw’, $options); 78
  79. 79. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting HTTP transport • HTTP/CGI interface, no drivers needed (1.5.0+) • Not enabled by default (secure) § See http://www.youngiprofessionals.com/wiki/XMLSERVICE § “Optional XMLSERVICE REST interface via RPG CGI (xmlcgi.pgm)” • Point to it with toolkit.ini 79 [transport] ; transport type allows configuration of transport from this INI. transportType = "http" ; ibm_db2 is default. Other choices: "odbc", "http" ; for http transport only httpTransportUrl = "http://example.com/cgi-bin/xmlcgi.pgm" ; default plug size (expected output size): 4K, 32K, 512K (default), 65K, 512K, 1M, 5M, 10M, 15M ; can also change in code with $conn->setOptions(array('plugSize' => '4K')); or desired size
  80. 80. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting 
 Performance “do”s and “don’t”s 80
  81. 81. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Performance “don’t”s • Don’t use disconnect() unless it’s the end of the day, logout, etc. • Reconnection in stateful mode is slow • Official samples set a bad example here • Don’t allow inquiry messages to arise, hanging your job (and maybe more) • See MONMSG and related topics to prevent this • Don’t run commands or programs that might return an error to the toolkit • Example: ADDLIBLE can return “already exists” error. Prefer CHGLIBL or other technique • Toolkit will fetch joblog for error reporting, which can be slow • Not XMLSERVICE’s fault…in future we may allow “fast” (no joblog) mode sometimes for non-critical errors 81
  82. 82. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Performance “do”s • Do use the proper connection option • Stateless: usually simplest and best. No new jobs needed • Stateful (InternalKey): requires care in choosing IPC key, and not disconnecting too often • Do set plugSize as small as possible for the expected data • $conn->setOptions(array(‘plugSize’=>’4K’)); // minimum • Others are 32K, 512K, 65K, 512K, 1M, 5M, 10M, 15M • Do use a persistent db2 connection that you share with the toolkit • See previous slide: “How to use persistent DB2 connection” • Do combine multiple command and program calls in a single CL program, then call the CL from the toolkit • Also wrap “RTV*” commands in CL 82
  83. 83. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting 
 Troubleshooting 83
  84. 84. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Retrieve error code and message • getErrorCode(), getErrorMsg() • These will return a CFP-type code and descriptive message obtained from the joblog
 echo 'Problem calling program. Code: ’ . $conn->getErrorCode() . '. Text: ' . $conn->getErrorMsg(); Problem calling program. Code: RNX1216 Text: Error message CPF4103 appeared during OPEN for file MNG111FM 84
  85. 85. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Troubleshooting tips • Get latest toolkit version § Start with Zend Server download site § or latest XMLSERVICE and PHP wrapper • http://www.youngiprofessionals.com/wiki/XMLSERVICE § Test in XMLSERVICE library if unsure
 • Use Z-Ray § View returned XML including joblog if an error occurred
 • Create debug log § In toolkit.ini, set debug=true, then run script again • Creates /usr/local/zendsvr6/share/toolkitapi/debug.log • debug.log contains all XML send/received, connection info • Tip: to split into daily logs, specify:
 $conn->setOptions(array('debug'=>true, 'debugLogFile' =>'/usr/ local/zendsvr6/var/log/toolkit_debug' . date("Ymd") . '.log')); 85
  86. 86. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Z-Ray will speed development • Shows every query and time for each query • Toolkit extension for Z-Ray shows each program call, input/output, timing • Save time otherwise spent hunting in debug logs! 86
  87. 87. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Interactively debug RPG or COBOL program 1. Add the following line to your PHP script before the program call to be debugged. $toolkitConn should be your toolkit connection object. $toolkitConn->setOptions(array(‘customControl'=>'*debug')); Run your script. The script will "hang" while it waits on #2 below...(move to green screen 5250 for steps 2-10) 2. A MSGW inquiry message in DSPMSG QSYSOPR will be generated by the toolkit. 3. Note the job information (number, name, user) provided in the MSGW. 4. STRSRVJOB using that job information as parameters. 5. STRDBG with the program and library you wish to debug. 6. Answer the MSGW. Any answer will do--"G" is fine. 7. The RPG program source will appear in debug mode in your terminal, ready to step through, allowing you to inspect variables, etc. 8. When done inspecting and stepping, let the RPG program complete (using function keys indicated on screen). 9. ENDDBG 10. ENDSRVJOB 87
  88. 88. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting 
 Future of toolkit 88
  89. 89. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting The latest • PHP toolkit version 1.6.1 / XMLSERVICE 1.9.2 § Faster § Experimental “fetch data via recordset” so that plugSize may not be needed in future • Future § Always faster and faster § Further improvements for ease of use § Samples on GitHub Full list of current improvements: http://174.79.32.155/wiki/index.php/XMLSERVICE/XMLSERVICEChangeLog
 http://174.79.32.155/wiki/index.php/XMLSERVICE/CWChangeLog
 89
  90. 90. PHP Toolkit from Zend and IBM: Open Source on IBM iAlan Seiden Consulting Contact and get tips Alan Seiden Alan Seiden Consulting Ho-Ho-Kus, NJ 90 alan@alanseiden.com ● 201-447-2437 ● twitter: @alanseiden Free PHP tips: 
 http://alanseiden.com/tips
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×