phpblog 110000AD5E 350 Visits
Finally PHP 5.1 Beta 2 is live. I'm very excited about PHP 5.1 which is another big step for PHP.
Some of the key improvements of PHP 5.1 include:
* PDO (PHP Data Objects) - A new native database abstraction layer providing performance, ease-of-use, and flexibility.
* Significantly improved language performance mainly due to the new Zend Engine II execution architecture.
* The PCRE extension has been updated to PCRE 5.0.
* Many more improvements including lots of new functionality & many bug fixes, especially in regards to SOAP, streams and SPL.
* See the bundled NEWS file for a more complete list of changes.
Everyone is encouraged to start playing with this beta, although it is not yet recommended for mission-critical production use.[Read More]
phpblog 110000AD5E 364 Visits
I use PHP extensively on almost all of my Web pages. (Just about the only ones that don't use it are on servers that don't have it installed. Mine, of course, all have PHP installed.) In a lot of cases I store the real content in a database, and PHP pulls it out and formats it; sometimes the content is built directly from scanning files and directories.[Read More]
This has advantages and disadvantages, of course. On the pro side, the content is visible immediately. On the con side, the content is visible immediately. :-) Having every page be interpreted has definite performance implications and not just on the origin server. Unless care is taken, the dynamic nature of the page can result in it rarely or never being cached, which hits you in the system and the network. If you pay for your bandwidth by the byte, that can be a huge deal.
Like Sam, I use a mix of languages. For Web pages, I use PHP almost exclusively; for standalone apps I use C, PHP, bash, or Perl, as seems appropriate. In general I use Perl, but if I'm frobbing a database, chances are I'll use PHP unless there's something in CPAN that argues for Perl.
When I first got involved with blogging, in December 2002, I decided to write my own software from the ground up. In PHP. Of course, I'm a bit-twiddler, and did it that way so I'd understand what this 'blogging' thing was all about and how it worked. (Almost as soon as I brought it online, Sam challenged me to take the next step. :-) The result can be seen at my blog.
I hope to go into this subject in more detail in the future, and I definitely intend to say some things about how I'm using PHP to automatically guard my Web servers, but this is just an introductory note after all.
Different programming languages excel at different things. I employ a number of different programming languages, and make my choice based on the task at hand. My presentations tend to be powered by Perl. My weblog is powered by Python. But my private applications tend to be written in PHP.
The developerWorks PHP Resources site will cover PHP from a perspective that may be new to some PHP users, covering such topics as Access an enterprise application from a PHP script
The developerWorks PHP Blog, however, will often touch on topics that may be new to enterprise (typically Java) programmers.
My first post on this site will cover an application I wrote in about an hour to cover a specific need. It breaks a number of "rules" that guide the development of scalable enterprise applications - in particular it does not separate presentation from content. Consequently, this application does not contain any reusable components that will ultimately find their way into a Customer Relationship Management system. I'm entirely OK with that.
Still, the application is centrally managed, requires zero deployment, is accessible everywhere and portable across a wide range of client operating systems and browsers. All good traits to have.
The application is a vocabulary test. My daughter weekly gets a list of words and their definitions to study. At the end of the week, there is a test where she needs to match the words with the definitions. At first, I helped her study using flash cards, but this seemed like an obvious candidate for automation.
The UI for this application was obvious... I precisely mimicked the layout of the test.
Nothing in this application couldn't have been done with JSP. However, to do so would have required additional effort, effort that does not result in a more functional end result.
And it wouldn't have been as much fun.
Not everybody may have the diverse set of skills required to pull together such an application in one sitting. However, a quite larger set of people can copy such an application and successfully make meaningful changes to it.
In my experience, that's how people tend to learn languages such as PHP. Some refer to this as Progressive Disclosure.
Sam Ruby[Read More]
phpblog 110000AD5E 399 Visits
One of the most popular articles I've ever written has been about Preventing Image 'Theft'. I wrote it several years ago, but people are still reading it (evidently) and contacting me about it.[Read More]
I've recently had call to use this sort of thing myself, and what I've got now is rather more advanced than described in the original article. For instance, now I transparently intercept images 'going offsite' and replace them with a correctly-sized blank box containing text about the copyright. And for images I want to be basically previewable but not really usable (if people want a usable version they need to contact me) I watermark 'em.
Watermarking a digital image means adding information to the existing pixels. It can be involve adding invisible information for identification purposes, such as the Digimarc technique, or it can be to to visibly degrade the quality of the image, perhaps with a message. I've used both, but it's the latter mechanism I needed most recently.
Watermarking for degradation is an interesting challenge. There's nothing you can do short of actually destroying data to keep a really determined perp from gatting past your defences, but you can make it pretty difficult.
For instance, the degradation watermarking I set up recently uses a watermark with built-in noise, so there isn't a single same-colour region that can be undone. A perp would have to figure out what the watermark pixels are, pixel by pixel, in order to create a mask to remove it. And since I'm using it on dense JPEG images, that's a little difficult.
In addition, the watermark is repeated across the entire image, and not at regular intervals. Each one is jigged a bit at random, so no two previews of the same image should be identical. (Well, modulo repeats of the random sequence.) This keeps a perp from figuring that the watermark is repeated at fixed intervals, and using that to help remove it. Of course, if it accesses multiple previews of the same image, it can eventually probably figure out the pixel settings by comparing them. But I suspect that would be a major chore, too.
Both the replacement-with-notice and the watermarking are done in realtime as part of Apache's response to a Web request. The replacement is very low impact indeed, and doesn't cause performance to deteriorate noticeably, but the watermarking involves actual image manipulation, of megapixel images, and so can slow things down. So you can use the former on almost any server, but the latter really needs a machine with a lot of oomph to keep visitors happy.
You can, of course, get rid of the performance impact by watermarking the images ahead of time, and sending the results normally. That decreases the random factor, though,
and possibly makes the watermark more easily removed.
A few months ago, I talked to one of the leading CMS industry analysts and he mentioned how surprised he was to find the dominance of PHP in this market.
The available CMSs are anything from open-source freeware to proprietry to supported open-source.
Some familiar names (in no particular order) are Drupal, mambo, eZ and of course, the popular PHP-Nuke.
If I'd go through the whole list of great CMS systems I know in PHP, this post would start getting boring.
As I am asked very often what CMS I recommend, and with all the excellent packages out there it's hard to do so, I decided to post a link to The CMS Matrix which is a nice site that provides some initial matrix comparisons between the various CMS. Of course, at the end of the day you'll have to install some of them and actually try them to see if they suit your needs.
Andi Gutmans[Read More]
Next week sees the Zend/PHP Conference and Expo in San Francisco. It promises to be a great experience, with a goodly number of big industry keynote speakers, lots of hands-on tutorials, and three parallel session streams.
I'm presenting an introduction to Service Data Objects (SDO) on the first day which should give people the basic 101-level understanding of SDO and how to use it with XML and databases. I've included a few scenarios to hopefully keep it *real*. I'm really pleased to have been scheduled first on the parallel sessions, so I can then relax and enjoy the rest of the conference :-) .
I'm really looking forward to finally getting to meet members of the PHP community who've helped us in the creation of the SDO project. The support and guidance we've received throughout has been fantastic.
Graham Charters[Read More]
phpblog 110000AD5E 492 Visits
I feel like singing something Doctor Suessish:
Or perhaps a limerick:
And that just about blew my creativity diode for the day.
What it's about is fighting with
Perfectionist though I may be (although I doubt you'd ever be able to tell from my office at home), this is one of those all-too-numerous cases in which "right" is going to have to wait upon "good enough." I'll twiddle the styles until it looks the way I want it to do, and maybe some year I'll come back and do the styles right.
And, as usual, my perfectionism means that the scripts are too prototypical to show anybody; I'm too ashamed of their hacky kludgery. But perhaps one day..
phpblog 110000AD5E 513 Visits
At the suggestion of a friend, I added yet another twist to my watermarking script: rotating the watermark a random amount each time.
While cool in theory, it turns out that the practice is a little more difficult. For one thing, PHP's ImageRotate() function creates a new image resource sized large enough to hold the entire rotated image. Even though I'm using a circular watermark, the image it's in is rectangular. So if you rotate a rectangle and put a bounding box around it, you get a lozenge wider and taller than the original one.
For another thing, getting ImageRotate() to do the Right Thing with the transparency is turning out to be a hassle. I'm working with one of the developers of the PHP image library on figuring that one out; it's unclear whether the issue is my boneheadedness or an actual bug in PHP.
When it's finished, or at least far enough along, I'll post more technical details
Tomorrow I leave for Montreal to attend the PHP Quebec 2006 conference. It promises to be a really good event, with presentations from many prominent community members, including Rasmus.
I myself will be presenting and demonstrating SDO for PHP, and given I have a 90 minute slot, I thought it might be an opportunity to look into some of the theory. To that end I've been doing a bit of "design pattern archaeology" - hunting for design patterns after the fact. Armed with Martin Fowler's, "Patterns of Enterprise Architecture", and with help from other SDO project members, we quickly identified the following four:
There are others, but there's only so far you can take this kind of activity!
The demos I have show how to use SDO to work with relational and XML data. They include a simple Contacts management application, a noddy Blog/RSS feed, and WSDL generation.
If you're not able to make it to Montreal and are interested in SDO, the docs can be found here, and I'll post the presentation on this blog after the conference.
I presented an introduction to
One question which came up during the presentation was to do with the Relational Database Access Service and whether it optimizes the SQL queries it creates in order to remove redundancies. The short answer is, "no", but that's simply because it doesn't have to; SDO does the optimization for it.
The first thing to note is that SDOs keep a change summary, however, this summary only holds the information required to re-create the data object's original state, not any intermediate states. This is important when it comes to understanding how the updates are optimized.
Consider an example of a contact database (as described in this article). The contact database table contains a "shortname" column (e.g. "Fred") and a "fullname" column (e.g. "Frederick Flintstone"). Let's assume we've retrieved a set of contact SDOs from the database into the variable
The create and delete cancel each other out and the intermediate value of "Sally Smith" is not recorded, so the resulting change summary would only show that "Sally Barker" had changed her name to "Sally Jones". Consequently, when the Relational Data Access Service is asked to apply the changes back to the database, the only update it would see and perform is the name change.
The resulting SQL UPDATE statement would look like this:
with a parameter list of ("Sally Jones", primary key value, "Sally Barker")
SDO for PHP Project
SDO for PHP documentation
Relational Data Access Service documentation
We recently shipped version 1.0.3 of SDO for PHP. This was the first version to ship with the C++ SDO library from the Apache Tuscany open source project - in this case the Milestone 1 release, which was their first packaged version. Currently it's bundled with the SDO for PHP libraries, but as it becomes more stable, we should be able to use Tuscany as an external library too.
Apache Tuscany has both C++ and Java implementations of the SCA specification, as well as SDO. There's a growing community developing lots of exciting new stuff, who post news to http://apache-tuscany.blogspot.com/.
Caroline Maynard[Read More]
At last month's Zend Conference I was fortunate enough to attend Christian Wenz's tutorial on XML and Web services. This covered the use of technologies such as DOM and SimpleXML for working with XML data. As the title of this blog entry suggests, SDO provide a simple way to construct or extend XML documents.
The example below shows an XML schema used by an application which records information regarding quotations people have made (Thanks go to Christian Wenz for the scenario which is from his book entitled, "PHP Phrasebook", SAMS Publishing.). An XML document following this schema will contain a quotes element containing a number of quote elements, each of which consists of a phrase and an author element and a year attribute.
The code extract below shows how SDO can be used to load the XML schema and a quotes document and then add a new quote entry to that document.
The eight lines of code above do the following:
1. create and configure a new XML Data Access Service (DAS) with an XML schema.
2. use the XML DAS to load and validate an instance document.
3. retrieve the quotes currently contained in the document.
4-7. create a new quote and populate it with information posted from a form.
8. save the quotes (including the new quote) back to the xml file.
The same task takes 14 lines of code in DOM and in my opinion, DOM code is far less intuitive. I found it more difficult to understand the data structure from the code, because of the generic XML vocabulary of the DOM APIs. However, it is worth noting that the XML Data Access Service requires the existence of an XML schema, whereas DOM does not.
Because SDO knows about the XML schema, it lets you access the elements and attributes directly by name. The same is true of SimpleXML, however SDO can also be used to create new documents from scratch, or in this case, new fragments of XML. SimpleXML is limited in this regard because it only has knowledge of an instance document, rather than the schema. Again, it is worth noting that SimpleXML does not require the existence of an XML schema.
The SDO API does not reveal which names correspond to XML elements and which to XML attributes, but still outputs XML which follows the provided XML schema. Personally, I think this is quite neat, because often the choice to use an element or attribute in schema design is arbitrary and down to personal taste. This article nicely sums up the feelings I had when I created my first ever XML schema.
Graham Charters[Read More]
phpblog 110000AD5E 569 Visits
The week before last I was in Montreal, Quebec, Canada for PHP Quebec Conference 2005. One of the presentations I gave was about using PHP scripts instead of normally static files like
I'm not sure if there actually are any Type III robots out there, but if I can think of it I'm sure some perp somewhere already has as well.
The nasty part of the whole process is reliably identifying the perp. In these days of cable and
Of course, sometimes the client ID is a dead giveaway, such as
I've had a few requests for the
The slides give an overview of the main concepts behind SDOs, followed by a few scenarios showing how to use them to work with relational and XML data. As I mentioned in a previous blog, the presentation could have done with a few more scenarios to address SDO's strengths and the questions which arose, but unfortunately time was short. I therefore intend to use this blog to cover these over time.
If you have any comments or questions on the SDO project, please let us know.
Some people who attended my SDO for PHP talk at php|tek in Orlando wanted to be able to try out the demonstration programs. I've recently uploaded them to CVS. If you'd like to try them out, copy the whole /scenarios directory under your document root, and browse to it. Some of the commentary is bit terse, so do let us know if you can't make them work or find any problems.Incidentally, we've recently published a new article Streamline working with XML in PHP using Service Data Objects, which uses the same Half-baked Blog program shown in the demonstrations to illustrate working with SDOs and XML.
People at the talk had some interesting ideas about how they might use SDOs to solve problems - if you did go home and try them out, I'd be pleased to hear how you got on, and any opinions you'd like to share, positive or negative. I had great time at php|tek, especially hearing about so many diverse areas that people are working in - everyone seems to have something special about their requirements or their environment. I also liked watching the alligators in the lake, and taking my morning swim in the open air (not in the lake).
In recent months we've had some requests from developers who would like to contribute to the SDO for PHP project. We recently added a Contributor License Agreement file to the project, so we can now welcome any developer who would like to be involved. There are instructions in the file about where to send it. Our CLA is based on the Apache CLA, and does not ask you assign the rights to your code, or inhibit you from using it for any other purpose. It simply serves to state the the code is yours to give, and that you do not impose any restrictions on its use.
Caroline Maynard[Read More]