<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel>
    <title>PHP and Oracle: Christopher Jones</title>
  <link>https://blogs.oracle.com/opal/</link>
      
    <description>Notes on the Oracle PHP Apache Linux ("OPAL") stack, with bits of Python, Perl and Ruby for good luck</description>
  <language>en-us</language>
  <copyright>Copyright 2013</copyright>
  <lastBuildDate>Thu, 16 May 2013 20:14:32 +0000</lastBuildDate>
    <generator>Apache Roller BLOGS401ORA4 (20120329084749)</generator>
        <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ChristopherJonesOnOpal" /><feedburner:info uri="christopherjonesonopal" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/offline_processing_in_php_with</guid>
    <title>Offline Processing in PHP with Advanced Queuing </title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/5z0Kq_laNpI/offline_processing_in_php_with</link>
        <pubDate>Thu, 16 May 2013 20:14:32 +0000</pubDate>
    <category>php</category>
    <category>batch</category>
    <category>database</category>
    <category>offline</category>
    <category>performance</category>
    <category>php</category>
    <category>queue</category>
            <description>&lt;p&gt;Offloading slow batch tasks to an external process is a common
method of improving website responsiveness.  One great way to initiate
such background tasks in PHP is to use Oracle Streams Advanced Queuing
in a producer-consumer message passing fashion. Oracle AQ is highly
configurable. Messages can queued by multiple producers. Different
consumers can filter messages.  From PHP, the PL/SQL interface to AQ
is used.  There are also Java, C and HTTPS interfaces, allowing wide
architectural freedom.&lt;/p&gt;

&lt;p&gt;The following example simulates an application user registration
system where the PHP application queues each new user's street
address. An external system monitoring the queue can then fetch and
process that address. In real life the external system might initiate
a snail-mail welcome letter, or do further, slower automated
validation on the address.&lt;/p&gt;

&lt;p&gt;The following SQL*Plus script &lt;tt&gt;qcreate.sql&lt;/tt&gt; creates a new
Oracle user &lt;tt&gt;demoqueue&lt;/tt&gt; with permission to create and use
queues. A payload type for the address is created and a queue is set
up for this payload.  &lt;/p&gt;

&lt;pre&gt;
-- qcreate.sql

connect / as sysdba
drop user demoqueue cascade;

create user demoqueue identified by welcome;
grant connect, resource to demoqueue;
grant aq_administrator_role, aq_user_role to demoqueue;
grant execute on dbms_aq to demoqueue;
grant create type to demoqueue;

connect demoqueue/welcome@localhost/orcl

-- The data we want to queue
create or replace type user_address_type as object (
  name        varchar2(10),
  address     varchar2(50)
);
/

-- Create and start the queue
begin
 dbms_aqadm.create_queue_table(
   queue_table        =&amp;gt;  'demoqueue.addr_queue_tab',
   queue_payload_type =&amp;gt;  'demoqueue.user_address_type');
end;
/

begin
 dbms_aqadm.create_queue(
   queue_name         =&amp;gt;  'demoqueue.addr_queue',
   queue_table        =&amp;gt;  'demoqueue.addr_queue_tab');
end;
/

begin
 dbms_aqadm.start_queue(
   queue_name         =&amp;gt; 'demoqueue.addr_queue',
   enqueue            =&amp;gt; true);
end;
/
&lt;/pre&gt;

&lt;p&gt;The script &lt;tt&gt;qhelper.sql&lt;/tt&gt; creates two useful helper functions
to enqueue and dequeue messages:&lt;/p&gt;

&lt;pre&gt;
-- qhelper.sql
-- Helpful address enqueue/dequeue procedures

connect demoqueue/welcome@localhost/orcl

-- Put an address in the queue
create or replace procedure my_enq(name_p in varchar2, address_p in varchar2) as
  user_address       user_address_type;
  enqueue_options    dbms_aq.enqueue_options_t;
  message_properties dbms_aq.message_properties_t;
  enq_id             raw(16);
begin
  user_address := user_address_type(name_p, address_p);
  dbms_aq.enqueue(queue_name         =&amp;gt; 'demoqueue.addr_queue',
                  enqueue_options    =&amp;gt; enqueue_options,
                  message_properties =&amp;gt; message_properties,
                  payload            =&amp;gt; user_address,
                  msgid              =&amp;gt; enq_id);
  commit;
end;
/
show errors

-- Get an address from the queue
create or replace procedure my_deq(name_p out varchar2, address_p out varchar2) as
  dequeue_options    dbms_aq.dequeue_options_t;
  message_properties dbms_aq.message_properties_t;
  user_address       user_address_type;
  enq_id             raw(16);
begin
  dbms_aq.dequeue(queue_name         =&amp;gt; 'demoqueue.addr_queue',
                  dequeue_options    =&amp;gt; dequeue_options,
                  message_properties =&amp;gt; message_properties,
                  payload            =&amp;gt; user_address,
                  msgid              =&amp;gt; enq_id);
  name_p    := user_address.name;
  address_p := user_address.address;
  commit;
end;
/
show errors
&lt;/pre&gt;

&lt;p&gt;The script &lt;tt&gt;newuser.php&lt;/tt&gt; is the part of the PHP application
that handles site registration for a new user. It queues a message
containing their address and continues executing:&lt;/p&gt;

&lt;pre&gt;
&amp;lt;?php
// newuser.php

$c = oci_connect("demoqueue", "welcome", "localhost/orcl");

// The new user details
$username = 'Fred';
$address  = '500 Oracle Parkway';

// Enqueue the address for later offline handling
$s = oci_parse($c, "begin my_enq(:username, :address); end;");
oci_bind_by_name($s, ":username", $username, 10);
oci_bind_by_name($s, ":address",  $address,  50);
$r = oci_execute($s);

// Continue executing
echo "Welcome $username\n";

?&amp;gt;
&lt;/pre&gt;

&lt;p&gt;It executes an anonymous PL/SQL block to create and enqueue the
address message. The immediate script output is simply the echoed
welcome message: &lt;/p&gt;

&lt;pre&gt;
Welcome Fred
&lt;/pre&gt;

&lt;p&gt;Once this PHP script is executed, any application can dequeue the
new message at its leisure.  For example, the following SQL*Plus
commands call the helper &lt;tt&gt;my_deq()&lt;/tt&gt; dequeue function and
displays the user details: &lt;/p&gt;

&lt;pre&gt;
-- getuser.sql

connect demoqueue/welcome@localhost/orcl

set serveroutput on
declare
  name varchar2(10);
  address varchar2(50);
begin
  my_deq(name, address);
  dbms_output.put_line('Name     : ' || name);
  dbms_output.put_line('Address  : ' || address);
end;
/
&lt;/pre&gt;

&lt;p&gt;The output is:&lt;/p&gt;

&lt;pre&gt;
Name     : Fred
Address  : 500 Oracle Parkway
&lt;/pre&gt;

&lt;p&gt;If you instead want to check the queue from PHP, use
&lt;tt&gt;getuser.php&lt;/tt&gt;:&lt;/p&gt;

&lt;pre&gt;
&amp;lt;?php
// getuser.php

$c = oci_connect("demoqueue", "welcome", "localhost/orcl");

// dequeue the message
$sql = "begin my_deq(:username, :address); end;";
$s = oci_parse($c, $sql);
oci_bind_by_name($s, ":username", $username, 10);
oci_bind_by_name($s, ":address", $address, 50);
$r = oci_execute($s);

echo "Name     : $username\n";
echo "Address  : $address\n";

?&amp;gt;&lt;/pre&gt;

&lt;p&gt;If the dequeue operation is called without anything in the queue,
it will block waiting for a message until the queue wait time
expires.&lt;/p&gt;

&lt;p&gt;The PL/SQL API has much more functionality than shown in this
overview. For example you can enqueue an array of messages, or listen
to more than one queue.  Queuing is highly configurable and scalable,
providing a great way to distribute workload for a web
application. Oracle Advanced Queuing is available in all editions of
the database.  More information about AQ is in the &lt;a
href="http://docs.oracle.com/cd/E11882_01/server.112/e11013/toc.htm" &gt;
Oracle Streams Advanced Queuing User's Guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt; Bootnote: The basis for this blog post comes from the &lt;a
href="http://www.oracle.com/technetwork/topics/php/underground-php-oracle-manual-098250.html"
&gt;Underground PHP and Oracle Manual&lt;/a&gt; &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/5z0Kq_laNpI" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/offline_processing_in_php_with</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/getting_started_with_php_zend</guid>
    <title>Getting Started with PHP Zend Framework 2 for Oracle DB</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/VICQhBJOllM/getting_started_with_php_zend</link>
        <pubDate>Tue, 14 May 2013 18:56:52 +0000</pubDate>
    <category>php</category>
    <category>framework</category>
    <category>php</category>
            <description>&lt;p&gt;This post shows the changes to the &lt;a
href="http://zf2.readthedocs.org/en/latest/user-guide/overview.html"
&gt;ZF2 tutorial application&lt;/a&gt; to allow it to run with Oracle
Database 11&lt;i&gt;g&lt;/i&gt;R2.&lt;/p&gt;

&lt;p&gt;Oracle Database SQL identifiers are case insensitive by default so
"select Abc from Xyz" is the same as "select abc from xyz".  However
the identifier metadata returned to programs like PHP is standardized
to uppercase by default.  After executing either query PHP knows that
column "ABC" was selected from table "XYZ". &lt;/p&gt;

&lt;p&gt;In PHP code, array indices and object attributes need to match the
schema identifier case that is returned by the database. This is
either done by using uppercase indices and attributes in the PHP code,
or by forcing the SQL schema to case-sensitively use lower-case
names.&lt;/p&gt;

&lt;p&gt;The former approach is more common, and is shown here.&lt;/p&gt;

&lt;p&gt;The instructions for creating the sample ZF2 application are &lt;a
href="http://zf2.readthedocs.org/en/latest/user-guide/overview.html"
&gt;here&lt;/a&gt;.  Follow those steps as written, making the substitutions
shown below.&lt;/p&gt;

&lt;h2&gt;Schema&lt;/h2&gt;

&lt;p&gt;In Oracle 11&lt;i&gt;g&lt;/i&gt;R2, the schema can be created like:&lt;/p&gt;

&lt;pre&gt;
DROP USER ZF2 CASCADE;

CREATE USER ZF2 IDENTIFIED BY WELCOME
    DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS
    TEMPORARY TABLESPACE TEMP;

GRANT CREATE SESSION
    , CREATE TABLE
    , CREATE PROCEDURE
    , CREATE SEQUENCE
    , CREATE TRIGGER
    , CREATE VIEW
    , CREATE SYNONYM
    , ALTER SESSION
TO ZF2;

CONNECT ZF2/WELCOME

CREATE TABLE ALBUM (
  ID NUMBER NOT NULL,
  ARTIST VARCHAR2(100) NOT NULL,
  TITLE VARCHAR2(100) NOT NULL,
  PRIMARY KEY (ID)
);

CREATE SEQUENCE ALBUMSEQ;

CREATE TRIGGER ALBUMTRIGGER BEFORE INSERT ON ALBUM FOR EACH ROW
BEGIN
  :NEW.ID := ALBUMSEQ.NEXTVAL;
END;
/

INSERT INTO ALBUM (ARTIST, TITLE)
    VALUES ('The  Military  Wives', 'In  My  Dreams');
INSERT INTO ALBUM (ARTIST, TITLE)
    VALUES ('Adele', '21');
INSERT INTO ALBUM (ARTIST, TITLE)
    VALUES ('Bruce  Springsteen', 'Wrecking Ball (Deluxe)');
INSERT INTO ALBUM (ARTIST, TITLE)
    VALUES ('Lana  Del  Rey', 'Born  To  Die');
INSERT INTO ALBUM (ARTIST, TITLE)
    VALUES ('Gotye', 'Making  Mirrors');

COMMIT;
&lt;/pre&gt;

&lt;h2&gt;Driver and Credentials&lt;/h2&gt;

&lt;p&gt;The driver and credentials are Oracle-specific. Always use the OCI8
adapter in ZF, since it is more stable and has better scalability.
Specifying a character set will make connection faster.&lt;/p&gt;

&lt;b&gt;zf2-tutorial/config/autoload/global.php:&lt;/b&gt;

&lt;pre&gt; return array(
     'db' =&amp;gt; array(
-        'driver'         =&amp;gt; 'Pdo',
-        'dsn'            =&amp;gt; 'mysql:dbname=zf2tutorial;host=localhost',
-        'driver_options' =&amp;gt; array(
-            PDO::MYSQL_ATTR_INIT_COMMAND =&amp;gt; 'SET NAMES \'UTF8\''
-        ),
+        'driver'         =&amp;gt; 'OCI8',
+        'connection_string' =&amp;gt; 'localhost/orcl',
+        'character_set' =&amp;gt; 'AL32UTF8',
     ),
     'service_manager' =&amp;gt; array(
         'factories' =&amp;gt; array(
&lt;/pre&gt;

&lt;b&gt;zf2-tutorial/config/autoload/local.php:&lt;/b&gt;
 
&lt;pre&gt; return array(
     'db' =&amp;gt; array(
-        'username' =&amp;gt; 'YOUR USERNAME HERE',
-        'password' =&amp;gt; 'YOUR USERNAME HERE',
+        'username' =&amp;gt; 'ZF2',
+        'password' =&amp;gt; 'WELCOME',
     ),
     // Whether or not to enable a configuration cache.
     // If enabled, the merged configuration will be cached and used in
&lt;/pre&gt;

&lt;h2&gt;Attribute &amp;amp; Index Changes&lt;/h2&gt;

&lt;p&gt;The rest of the application changes are just to handle the case of
the Oracle identifiers correctly.&lt;/p&gt;

&lt;b&gt;zf2-tutorial/module/Album/Module.php&lt;/b&gt;

&lt;pre&gt;
                     $dbAdapter = $sm-&amp;gt;get('Zend\Db\Adapter\Adapter');
                     $resultSetPrototype = new ResultSet();
                     $resultSetPrototype-&amp;gt;setArrayObjectPrototype(new Album());
-                    return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);
+                    return new TableGateway('ALBUM', $dbAdapter, null, $resultSetPrototype);
                 },
             ),
         );
&lt;/pre&gt;

&lt;b&gt;zf2-tutorial/module/Album/view/album/album/add.phtml&lt;/b&gt;
&lt;pre&gt;
 $form-&amp;gt;prepare();
 
 echo $this-&amp;gt;form()-&amp;gt;openTag($form);
-echo $this-&amp;gt;formHidden($form-&amp;gt;get('id'));
-echo $this-&amp;gt;formRow($form-&amp;gt;get('title'));
-echo $this-&amp;gt;formRow($form-&amp;gt;get('artist'));
+echo $this-&amp;gt;formHidden($form-&amp;gt;get('ID'));
+echo $this-&amp;gt;formRow($form-&amp;gt;get('TITLE'));
+echo $this-&amp;gt;formRow($form-&amp;gt;get('ARTIST'));
 echo $this-&amp;gt;formSubmit($form-&amp;gt;get('submit'));
 echo $this-&amp;gt;form()-&amp;gt;closeTag();
&lt;/pre&gt;

&lt;b&gt;zf2-tutorial/module/Album/view/album/album/delete.phtml&lt;/b&gt;

&lt;pre&gt; &amp;lt;h1&amp;gt;&amp;lt;?php echo $this-&amp;gt;escapeHtml($title); ?&amp;gt;&amp;lt;/h1&amp;gt;
 
 &amp;lt;p&amp;gt;Are you sure that you want to delete
-'&amp;lt;?php echo $this-&amp;gt;escapeHtml($album-&amp;gt;title); ?&amp;gt;' by
-'&amp;lt;?php echo $this-&amp;gt;escapeHtml($album-&amp;gt;artist); ?&amp;gt;'?
+'&amp;lt;?php echo $this-&amp;gt;escapeHtml($album-&amp;gt;TITLE); ?&amp;gt;' by
+'&amp;lt;?php echo $this-&amp;gt;escapeHtml($album-&amp;gt;ARTIST); ?&amp;gt;'?
 &amp;lt;/p&amp;gt;
 &amp;lt;?php
 $url = $this-&amp;gt;url('album', array(
            'action' =&amp;gt; 'delete',
-           'id'     =&amp;gt; $this-&amp;gt;id,
+           'id'     =&amp;gt; $this-&amp;gt;ID,
        ));
 ?&amp;gt;
 &amp;lt;form action="&amp;lt;?php echo $url; ?&amp;gt;" method="post"&amp;gt;
     &amp;lt;div&amp;gt;
-    &amp;lt;input type="hidden" name="id" value="&amp;lt;?php echo (int) $album-&amp;gt;id; ?&amp;gt;" /&amp;gt;
+    &amp;lt;input type="hidden" name="id" value="&amp;lt;?php echo (int) $album-&amp;gt;ID; ?&amp;gt;" /&amp;gt;
     &amp;lt;input type="submit" name="del" value="Yes" /&amp;gt;
     &amp;lt;input type="submit" name="del" value="No" /&amp;gt;
     &amp;lt;/div&amp;gt;
&lt;/pre&gt;

&lt;b&gt;zf2-tutorial/module/Album/view/album/album/edit.phtml&lt;/b&gt;

&lt;pre&gt;         'album',
         array(
             'action' =&amp;gt; 'edit',
-            'id'     =&amp;gt; $this-&amp;gt;id,
+            'id'     =&amp;gt; $this-&amp;gt;ID,
         )
     ));
 $form-&amp;gt;prepare();
 
 echo $this-&amp;gt;form()-&amp;gt;openTag($form);
-echo $this-&amp;gt;formHidden($form-&amp;gt;get('id'));
-echo $this-&amp;gt;formRow($form-&amp;gt;get('title'));
-echo $this-&amp;gt;formRow($form-&amp;gt;get('artist'));
+echo $this-&amp;gt;formHidden($form-&amp;gt;get('ID'));
+echo $this-&amp;gt;formRow($form-&amp;gt;get('TITLE'));
+echo $this-&amp;gt;formRow($form-&amp;gt;get('ARTIST'));
 echo $this-&amp;gt;formSubmit($form-&amp;gt;get('submit'));
 echo $this-&amp;gt;form()-&amp;gt;closeTag();
&lt;/pre&gt;

&lt;b&gt;zf2-tutorial/module/Album/view/album/album/index.phtml&lt;/b&gt;

&lt;pre&gt;&amp;lt;/tr&amp;gt;
 &amp;lt;?php foreach ($albums as $album) : ?&amp;gt;
 &amp;lt;tr&amp;gt;
-&amp;lt;td&amp;gt;&amp;lt;?php echo $this-&amp;gt;escapeHtml($album-&amp;gt;title);?&amp;gt;&amp;lt;/td&amp;gt;
-&amp;lt;td&amp;gt;&amp;lt;?php echo $this-&amp;gt;escapeHtml($album-&amp;gt;artist);?&amp;gt;&amp;lt;/td&amp;gt;
+&amp;lt;td&amp;gt;&amp;lt;?php echo $this-&amp;gt;escapeHtml($album-&amp;gt;TITLE);?&amp;gt;&amp;lt;/td&amp;gt;
+&amp;lt;td&amp;gt;&amp;lt;?php echo $this-&amp;gt;escapeHtml($album-&amp;gt;ARTIST);?&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;td&amp;gt;
 &amp;lt;a href="&amp;lt;?php echo $this-&amp;gt;url('album',
-            array('action'=&amp;gt;'edit', 'id' =&amp;gt; $album-&amp;gt;id));?&amp;gt;"&amp;gt;Edit&amp;lt;/a&amp;gt;
+            array('action'=&amp;gt;'edit', 'id' =&amp;gt; $album-&amp;gt;ID));?&amp;gt;"&amp;gt;Edit&amp;lt;/a&amp;gt;
     &amp;lt;a href="&amp;lt;?php echo $this-&amp;gt;url('album',
-            array('action'=&amp;gt;'delete', 'id' =&amp;gt; $album-&amp;gt;id));?&amp;gt;"&amp;gt;Delete&amp;lt;/a&amp;gt;
+            array('action'=&amp;gt;'delete', 'id' =&amp;gt; $album-&amp;gt;ID));?&amp;gt;"&amp;gt;Delete&amp;lt;/a&amp;gt;
     &amp;lt;/td&amp;gt;
     &amp;lt;/tr&amp;gt;
 &amp;lt;?php endforeach; ?&amp;gt;
&lt;/pre&gt;

&lt;b&gt;zf2-tutorial/module/Album/src/Album/Model/Album.php&lt;/b&gt;

&lt;pre&gt;
 class Album
 {
-    public $id;
-    public $artist;
-    public $title;
+    public $ID;
+    public $ARTIST;
+    public $TITLE;
     protected $inputFilter;
 
     public function exchangeArray($data)
     {
-        $this-&amp;gt;id     = (!empty($data['id'])) ? $data['id'] : null;
-        $this-&amp;gt;artist = (!empty($data['artist'])) ? $data['artist'] : null;
-        $this-&amp;gt;title  = (!empty($data['title'])) ? $data['title'] : null;
+        $this-&amp;gt;ID     = (!empty($data['ID'])) ? $data['ID'] : null;
+        $this-&amp;gt;ARTIST = (!empty($data['ARTIST'])) ? $data['ARTIST'] : null;
+        $this-&amp;gt;TITLE  = (!empty($data['TITLE'])) ? $data['TITLE'] : null;
     }
 
     public function getArrayCopy()
&lt;/pre&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;pre&gt;
             $factory     = new InputFactory();
 
             $inputFilter-&amp;gt;add($factory-&amp;gt;createInput(array(
-                        'name'     =&amp;gt; 'id',
+                        'name'     =&amp;gt; 'ID',
                         'required' =&amp;gt; true,
                         'filters'  =&amp;gt; array(
                             array('name' =&amp;gt; 'Int'),
&lt;/pre&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;pre&gt;
                     )));
 
             $inputFilter-&amp;gt;add($factory-&amp;gt;createInput(array(
-                        'name'     =&amp;gt; 'artist',
+                        'name'     =&amp;gt; 'ARTIST',
                         'required' =&amp;gt; true,
                         'filters'  =&amp;gt; array(
                             array('name' =&amp;gt; 'StripTags'),
&lt;/pre&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;pre&gt;
                     )));
 
             $inputFilter-&amp;gt;add($factory-&amp;gt;createInput(array(
-                        'name'     =&amp;gt; 'title',
+                        'name'     =&amp;gt; 'TITLE',
                         'required' =&amp;gt; true,
                         'filters'  =&amp;gt; array(
                             array('name' =&amp;gt; 'StripTags'),
&lt;/pre&gt;

&lt;b&gt;zf2-tutorial/module/Album/src/Album/Model/AlbumTable.php&lt;/b&gt;

&lt;pre&gt;
     public function getAlbum($id)
     {
         $id  = (int) $id;
-        $rowset = $this-&amp;gt;tableGateway-&amp;gt;select(array('id' =&amp;gt; $id));
+        $rowset = $this-&amp;gt;tableGateway-&amp;gt;select(array('ID' =&amp;gt; $id));
         $row = $rowset-&amp;gt;current();
         if (!$row) {
             throw new \Exception("Could not find row $id");

&lt;/pre&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;pre&gt;
     public function saveAlbum(Album $album)
     {
         $data = array(
-            'artist' =&amp;gt; $album-&amp;gt;artist,
-            'title'  =&amp;gt; $album-&amp;gt;title,
+            'ARTIST' =&amp;gt; $album-&amp;gt;ARTIST,
+            'TITLE'  =&amp;gt; $album-&amp;gt;TITLE,
         );
 
-        $id = (int)$album-&amp;gt;id;
+        $id = (int)$album-&amp;gt;ID;
         if ($id == 0) {
             $this-&amp;gt;tableGateway-&amp;gt;insert($data);
         } else {
             if ($this-&amp;gt;getAlbum($id)) {
-                $this-&amp;gt;tableGateway-&amp;gt;update($data, array('id' =&amp;gt; $id));
+                $this-&amp;gt;tableGateway-&amp;gt;update($data, array('ID' =&amp;gt; $id));
             } else {
                 throw new \Exception('Form id does not exist');
             }

&lt;/pre&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;pre&gt;
     public function deleteAlbum($id)
     {
-        $this-&amp;gt;tableGateway-&amp;gt;delete(array('id' =&amp;gt; $id));
+        $this-&amp;gt;tableGateway-&amp;gt;delete(array('ID' =&amp;gt; $id));
     }
 }
&lt;/pre&gt;

&lt;b&gt;zf2-tutorial/module/Album/src/Album/Form/AlbumForm.php&lt;/b&gt;
&lt;pre&gt;
         parent::__construct('album');
         $this-&amp;gt;setAttribute('method', 'post');
         $this-&amp;gt;add(array(
-                'name' =&amp;gt; 'id',
+                'name' =&amp;gt; 'ID',
                 'type' =&amp;gt; 'Hidden',
             ));
         $this-&amp;gt;add(array(
-                'name' =&amp;gt; 'title',
+                'name' =&amp;gt; 'TITLE',
                 'type' =&amp;gt; 'Text',
                 'options' =&amp;gt; array(
                     'label' =&amp;gt; 'Title',
                 ),
             ));
         $this-&amp;gt;add(array(
-                'name' =&amp;gt; 'artist',
+                'name' =&amp;gt; 'ARTIST',
                 'type' =&amp;gt; 'Text',
                 'options' =&amp;gt; array(
                     'label' =&amp;gt; 'Artist',
&lt;/pre&gt;

&lt;b&gt;zf2-tutorial/module/Album/src/Album/Controller/AlbumController.php&lt;/b&gt;

&lt;pre&gt;
         }
 
         return array(
-            'id' =&amp;gt; $id,
+            'ID' =&amp;gt; $id,
             'form' =&amp;gt; $form,
         );
     }
&lt;/pre&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;pre&gt;
         }
 
         return array(
-            'id'    =&amp;gt; $id,
+            'ID'    =&amp;gt; $id,
             'album' =&amp;gt; $this-&amp;gt;getAlbumTable()-&amp;gt;getAlbum($id)
         );
     }
&lt;/pre&gt;

&lt;p&gt;When you create applications from scratch it will be straightforward
to get it all working.&lt;/p&gt;

&lt;/body&gt; &lt;/html&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/VICQhBJOllM" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/getting_started_with_php_zend</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/otn_forum_software_is_going</guid>
    <title>OTN Forum software is going to be upgraded in May 2013</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/tjL2B10TrYk/otn_forum_software_is_going</link>
        <pubDate>Tue, 30 Apr 2013 23:23:21 +0000</pubDate>
    <category>General</category>
    <category>forum</category>
    <category>upgrade</category>
            <description>Update: the migration has been delayed so they can "establish thread level redirects across the site". Yay!
&lt;p&gt;
In case you missed the notifications, the Oracle Technology Network &lt;a href="https://forums.oracle.com/forums/main.jspa?categoryID=84"&gt;forum&lt;/a&gt; software is going to be upgraded this weekend.  This is great, since the old software is getting long-in-the-tooth and doesn't allow a bunch of useful features.  The current forums will be in read-only mode over the weekend.
&lt;p&gt;
On launch of the new version, a minimal set of features will be supported.  Once the upgrade is stable, then additional features will be turned on.
&lt;p&gt;
As a side part to the migration project, some little used and obsolete forums will be removed.  Some other categories will be reworked. 
&lt;p&gt;
You can get more information about the migration &lt;a href="https://forums.oracle.com/forums/thread.jspa?threadID=2519003"&gt;here&lt;/a&gt;. One thing to note is that the forum software is powered by Jive; i.e it is a packaged application so not all features you (and I) have requested will magically become feasible.  And also, for better or worse, Jive has renamed "forums" as "spaces" - apparently we can't change this.&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/tjL2B10TrYk" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/otn_forum_software_is_going</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/python_cx_oracle_and_oracle</guid>
    <title>Python cx_Oracle and Oracle 11g DRCP Connection Pooling</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/fH0uxakr78g/python_cx_oracle_and_oracle</link>
        <pubDate>Thu, 21 Mar 2013 23:18:48 +0000</pubDate>
    <category>python</category>
    <category>connection</category>
    <category>database</category>
    <category>mod_python</category>
    <category>performance</category>
    <category>pool</category>
    <category>python</category>
            <description>&lt;p&gt;The topic of Oracle 11&lt;i&gt;g&lt;/i&gt; DRCP connection pooling in Python
cx_Oracle came up twice this week for me.  DRCP is a database tier
connection pooling solution which is great for applications run in
multiple processes.  There is a &lt;a
href="http://www.oracle.com/technetwork/topics/php/php-scalability-ha-twp-128842.pdf"
&gt;whitepaper on DRCP&lt;/a&gt; that covers a lot of background and talks
about configuration.  This whitepaper is ostensibly about PHP but is
good reading for all DRCP users.&lt;/p&gt;

&lt;p&gt;The first DRCP and cx_Oracle scenario I dealt with was a question
about mod_python.&lt;/p&gt;

&lt;p&gt;To cut a long story short, I created a handler and requested it
1000 times via Apache's 'ab' tool.  In my first script, and despite
having increased the default pool parameters, there were a high number
of NUM_WAITS.  Also NUM_AUTHENTICATIONS was high.  Performance wasn't
the best.  Querying V$CPOOL_CC_STATS showed:&lt;/p&gt;

&lt;pre&gt;
CCLASS_NAME  NUM_REQUESTS   NUM_HITS NUM_MISSES  NUM_WAITS NUM_AUTHENTICATIONS
------------ ------------ ---------- ---------- ---------- -------------------
HR.CJDEMO1           1000        992          8        478                1000
&lt;/pre&gt;

&lt;p&gt;At least the session information in each DRCP server was reused
(shown via a high NUM_HITS).&lt;/p&gt;

&lt;p&gt;Results were better after fixing the script to look like:&lt;/p&gt;

&lt;pre&gt;from mod_python import apache
import cx_Oracle
import datetime

# Example: Oracle 11g DRCP with cx_Oracle and mod_python

# These pool params are suitable for Apache Pre-fork MPM
mypool = cx_Oracle.SessionPool(user='hr', password='welcome',
         dsn='localhost/orcl:pooled', min=1, max=2, increment=1)

def handler(req):
    global mypool

    req.content_type = 'text/html'
    n = datetime.datetime.now()
    req.write (str(n) + "&amp;lt;br&amp;gt;");

    db = cx_Oracle.connect(user='hr', password='welcome',
            dsn='localhost/orcl:pooled', pool=mypool, cclass="CJDEMO1",
            purity=cx_Oracle.ATTR_PURITY_SELF)

    cur = db.cursor()
    cur.execute('select * from locations')
    resultset = cur.fetchall()
    for result in resultset:
        for item in result:
            req.write (str(item) + " ")
        req.write ("&amp;lt;br&amp;gt;")
    cur.close()
    mypool.release(db)

    return apache.OK
&lt;/pre&gt;

&lt;p&gt;The 'ab' benchmark on this script ran much faster and the stats
from V$CPOOL_CC_STATS looked much better. The number of
authentications was right down about to about 1 per Apache
(ie. mod_python) process:&lt;/p&gt;

&lt;pre&gt;
CCLASS_NAME  NUM_REQUESTS   NUM_HITS NUM_MISSES  NUM_WAITS NUM_AUTHENTICATIONS
------------ ------------ ---------- ---------- ---------- -------------------
HR.CJDEMO1           1000        977         23         13                  26
&lt;/pre&gt;

&lt;p&gt;The NUM_HITS was high again, because the DRCP purity was
ATTR_PURITY_SELF.  If I hadn't wanted session information to be reused
each time the handler was executed, I could have set the purity to
ATTR_PURITY_NEW.  If I'd done this then NUM_HITS would have been low
and NUM_MISSES would have been high.&lt;/p&gt;

&lt;p&gt;If you're testing this yourself, before restarting the DRCP pool
don't forget to shutdown Apache to close all DB connections. Otherwise
restarting the pool will block.  Also, if you're interpreting your
own V$CPOOL_CC_STATS stats don't forget to account for the DRCP
"dedicated optimization" that retains an association between clients
(mod_python processes) and the DB. The whitepaper previously mentioned
discusses this.&lt;/p&gt;

&lt;p&gt;The second place where DRCP and python came up this week was on
the cx_Oracle mail list. David Stanek &lt;a
href=http://sourceforge.net/mailarchive/message.php?msg_id=30629284"&gt;posed
a question&lt;/a&gt;. He was seeing application processes blocking while
waiting for a DRCP pooled server to execute a query.  My variant of
David's script is:&lt;/p&gt;

&lt;pre&gt;
import os
import time
import cx_Oracle

# Example: Sub-optimal connection pooling with Oracle 11g DRCP and cx_Oracle

def do_connection():
    print 'Starting do_connection ' + str(os.getpid())
    con = cx_Oracle.connect(user=user, password=pw, dsn=dsn, cclass="CJDEMO2",
           purity=cx_Oracle.ATTR_PURITY_SELF)
    cur = con.cursor()
    print 'Querying ' + str(os.getpid())
    cur.execute("select to_char(systimestamp) from dual")
    print cur.fetchall()
    cur.close()
    con.close()
    print 'Sleeping ' + str(os.getpid())
    time.sleep(30)
    print 'Finishing do_connection ' + str(os.getpid())
 
user = 'hr'
pw = 'welcome'
dsn = 'localhost/orcl:pooled'
for x in range(100):
    pid = os.fork()
    if not pid:
        do_connection()
        os._exit(0)
&lt;/pre&gt;

&lt;p&gt;This script forks off a bunch of processes - more than the number
of pooled DRCP servers (see MAXSIZE in the DBA_CPOOL_INFO view).  The
first few processes grab a DRCP server from the pool and do their
query.  But they don't release the DRCP server back to the DRCP pool
until after the sleep() when the process ends.  The other forked
processes are blocked waiting for those DRCP servers to become
available. This isn't optimal pool sharing.&lt;/p&gt;

&lt;p&gt;My suggestion was to use an explicit cx_Oracle session pool
like this:&lt;/p&gt;

&lt;pre&gt;
import os
import time
import cx_Oracle

# Example: Connection pooling with Oracle 11g DRCP and cx_Oracle
 
def do_connection():
    print 'Starting do_connection ' + str(os.getpid())
    mypool = cx_Oracle.SessionPool(user=user,password=pw,dsn=dsn,min=1,max=2,increment=1)
    con = cx_Oracle.connect(user=user, password=pw,
          dsn=dsn, pool = mypool, cclass="CJDEMO3", purity=cx_Oracle.ATTR_PURITY_SELF)
    cur = con.cursor()
    print 'Querying ' + str(os.getpid())
    cur.execute("select to_char(systimestamp) from dual")
    print cur.fetchall()
    cur.close()
    mypool.release(con)
    print 'Sleeping ' + str(os.getpid())
    time.sleep(30)
    print 'Finishing do_connection ' + str(os.getpid())

user = 'hr'
pw = 'welcome'
dsn = 'localhost/orcl:pooled'
for x in range(100):
    pid = os.fork()
    if not pid:
        do_connection()
        os._exit(0)
&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;mypool.release(con)&lt;/code&gt; call releases the DRCP server
back to the DRCP pool prior to the sleep. When this second script is
run, there is a smoothness to the output. The queries happen
sequentially without noticeably being blocked.&lt;/p&gt;

&lt;p&gt;Like with any shared resource, it is recommended to release DRCP
pooled servers back to the pool when they are no longer needed by the
application.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/fH0uxakr78g" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/python_cx_oracle_and_oracle</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/using_php_5_5_s</guid>
    <title>Using PHP 5.5's New "OPcache" Opcode Cache</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/_F2kZle7Rcw/using_php_5_5_s</link>
        <pubDate>Fri, 15 Mar 2013 22:58:37 +0000</pubDate>
    <category>php</category>
    <category>cache</category>
    <category>compile</category>
    <category>opcode</category>
    <category>performance</category>
    <category>php</category>
            <description>&lt;p&gt;Zend have contributed their Zend Optimizer+ opcode cache to PHP
- thanks Zend!!! (Update 19 March 2013: the renaming to "Zend OPcache" is complete)&lt;/p&gt;

&lt;p&gt;&lt;blockquote&gt;"The Zend OPcache provides faster PHP execution through
opcode caching and optimization."&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt; The new OPcache extension can be seen as substitute for the venerable &lt;a
href="http://pecl.php.net/package/APC" &gt;APC cache&lt;/a&gt;, the maintenance
of which had become an issue.  Note: although OPcache is now readily
available, there is currently nothing preventing you from using any
available (working!) opcode cache in PHP 5.5.&lt;/p&gt;

&lt;p&gt; A few minutes ago Dmitry Stogov did the physical merge to the PHP
5.5 source's &lt;code&gt;ext/opcache&lt;/code&gt; directory. The current &lt;a
href="http://snaps.php.net/" &gt;PHP 5.5 snapshot&lt;/a&gt; has the code.
Future Alpha or Beta (and Production) releases will include it
too.&lt;/p&gt;

&lt;p&gt;Please test OPcache. It is not a panacea for all
performance problems. There are a lot of settings which may need
adjusting.  Understanding how it works and identifying issues during
the stabilization phase of PHP 5.5 release process will greatly
help.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;To build Zend OPcache for PHP 5.5:&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;When you configure PHP, add the option &lt;code&gt;--enable-opcache&lt;/code&gt; like:
&lt;/p&gt;

&lt;pre&gt;
./configure ... --enable-opcache
&lt;/pre&gt;

&lt;p&gt;

Then &lt;code&gt;make&lt;/code&gt; and &lt;code&gt;make install&lt;/code&gt;, as normal. This
will build OPcache shared extension.  It's not possible to build it
statically.&lt;/p&gt;

&lt;p&gt;Find the shared library in your installation directory with a command like
&lt;code&gt;find /home/cjones/php55 -name opcache.so&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Edit &lt;code&gt;php.ini&lt;/code&gt; and add the extension with its full path:&lt;/p&gt;

&lt;pre&gt;
zend_extension=/home/cjones/php55/lib/php/extension/debug-non-zts-20121212/opcache.so
&lt;/pre&gt;

&lt;p&gt;Update (25 March 2013): Dmitry &lt;a href="http://git.php.net/?p=php-src.git;a=commitdiff;h=0b8b6a727ddd31ff14e4af919c77a3f1b5e2b3f0"&gt;merged a PHP 5.5 change&lt;/a&gt; so that the full path is not required for &lt;code&gt;zend_extension&lt;/code&gt; libraries in the &lt;code&gt;extension_dir&lt;/code&gt; directory. You can now simply do &lt;code&gt;zend_extension=opcache.so&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You'll want to enable OPcache too:&lt;/p&gt;

&lt;pre&gt;
opcache.enable=On
&lt;/pre&gt;

&lt;p&gt;The &lt;a
href="https://raw.github.com/zendtech/ZendOptimizerPlus/master/README"
&gt;ext/opcache/README&lt;/a&gt; is the current source of documentation, and
lists all the other &lt;code&gt;php.ini&lt;/code&gt; parameters.&lt;/p&gt;

&lt;p&gt; Problems can be reported in the &lt;a
href="https://github.com/zendtech/ZendOptimizerPlus/issues" &gt;Github
issue tracker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Update (18 March 2013): In &lt;a href="http://git.php.net/?p=php-src.git;a=commitdiff;h=930b272d700a7f854357628e446505fab29906a8"&gt;a commit over the weekend&lt;/a&gt;, the build option &lt;code&gt;--enable-opcache&lt;/code&gt; is On by default.  You will still need to update php.ini.&lt;/p&gt; 

&lt;p&gt;&lt;b&gt;To build Zend OPcache for older versions of PHP:&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;You should be able to build OPcache with PHP 5.2 onwards&lt;/p&gt;

&lt;p&gt;Install it by getting the source from &lt;a
href="https://github.com/zendtech/ZendOptimizerPlus" &gt;Github&lt;/a&gt;.
There is also a &lt;a
href="http://pecl.php.net/package/ZendOptimizerPlus" &gt;PECL
repository&lt;/a&gt;; this is slightly out of date so I recommend using
Github. Follow the README instructions to install it.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;User-data cache:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The new opcode cache does not include a user-data cache.  Joe
Watkins recently started the &lt;a
href="https://github.com/krakjoe/apcu"&gt;APCu project&lt;/a&gt; to extract the
user-data cache code from APC. Test this too!&lt;/p&gt;

&lt;p&gt;Update 19 March 2013: Xinchen Hui is working on a lockless user-data cache, see &lt;a
href="https://github.com/laruence/yac"&gt;https://github.com/laruence/yac&lt;/a&gt;
and his blog about it &lt;a
href="http://www.laruence.com/2013/03/18/2846.html"&gt;here&lt;a&gt; (in
Chinese).&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/_F2kZle7Rcw" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/using_php_5_5_s</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/the_mysterious_php_rfc_process</guid>
    <title>The Mysterious PHP RFC Process and How You Can Change the Web</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/XA_2yLqPM8M/the_mysterious_php_rfc_process</link>
        <pubDate>Wed, 13 Feb 2013 01:50:24 +0000</pubDate>
    <category>php</category>
    <category>architecture</category>
    <category>language</category>
    <category>php</category>
    <category>rfc</category>
            <description>&lt;p&gt;The &lt;a href="https://wiki.php.net/rfc" &gt;PHP RFC&lt;/a&gt; process has
been in place for a while, and users new to core PHP development are
starting to use RFCs to propose desirable features.&lt;/p&gt;

&lt;p&gt;Here are some personal observations and suggestions that show how I
have seen feature acceptance and the RFC process work in
practice.  These notes augment the steps in &lt;a
href="https://wiki.php.net/rfc/howto"&gt;How To Create an RFC&lt;/a&gt;.  I
hope they help set expectations about the PHP RFC process and feature
acceptance in the PHP language.&lt;/p&gt;

&lt;ul&gt;

  &lt;li&gt;&lt;p&gt;Before starting an RFC, review existing RFCs and search the
  mail list archives for similar ideas.  Use this information to
  explain what your RFC will bring to the language.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; If you're new to PHP core development, mail the "internals" mail
  list to judge interest before you start your RFC.  If you get no
  reaction (this is likely) or positive reaction then create the RFC.
  Core PHP developers with karma will know when they can skip this
  step.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; Avoid presenting an RFC idea to the "internals" mail list with email
  that begins "I don't know much about ... but ...".  Do some research
  first.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; There are many really good ideas for improving PHP, however
  some of them are really tedious or technically risky or hard.  If
  you are about to email the "internals" mail list saying "someone
  should do ...", then don't hit "Send".  Work out how you could do it,
  and then send a patch.
&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;If the overall goals of PHP are not clear to you, you may not
  be alone.  However, as an RFC writer you need to learn the general
  trajectory of the language and where web development is heading.
  You then need to enthuse everyone with your feature and show what it
  brings to the language.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; Don't start an RFC (or mail list discussion) about standardizing PHP
  function names and function argument orders.  There are several
  historical reasons why the functions are what they are (including
  compatibility with underlying libraries), and many good reasons why
  the change would be counter-productive causing more end-user
  confusion, would lead to unmaintainable PHP engine code, and
  generally be a waste of everyone's time when they could be doing
  more interesting projects.  This has been discussed ad
  infinitum. Review previous discussions and feel free to fork PHP on
  github.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; Your RFC should talk about all PHP areas that will be
  affected: php.ini, different SAPIs, engine, extensions, etc.  List
  similar features.  List similar features in other languages.  Link
  to references.  Give an estimate of the actual positive impact to
  user code.  Put the proposed voting options in the RFC so they can
  be included in its discussion.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; Your RFC will be used to create the PHP documentation, so make its
  sections re-usable.  Explain concepts and details. Keep the RFC
  technical and have plenty of examples.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; Many current PHP RFCs don't contain enough detail, nor do they
  capture the pros &amp; cons that were discussed on the mail list.  You
  can, and should, do better than these RFCs.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; An implementation is not mandatory while proposing an RFC but
  it can help persuade people and help fine-tune the design.  Note
  that if you are unable to implement the RFC, and no one else
  volunteers during the discussion period, then your RFC is unlikely
  ever to be implemented.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; Don't start an implementation too early.  Get support for the
  feature concept from the "internals" mail list before spending time on
  coding - unless you want a learning experience.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; If you do have an implementation, make it clear whether the
  implementation is a simple prototype or is expected to be the final
  code.  This is specially important during the vote.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; It's easy to get sidetracked by mail list trolling or well
  intentioned but over-eager discussion.  Take advice on board but
  make sure your feature doesn't end up being designed by a committee.
  Don't blame the "PHP core community" for derailing discussions when
  the issues of non- code-contributors on the mail list are at fault.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;For every user who wants a backwardly incompatible change to
  PHP, there is a user who will scream that this will be disastrous to
  them.  As the RFC writer you need to walk the line between these
  groups. At voting time, other people may see the line in a different
  place than you do.

  &lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; There is no need to respond to every discussion email
  individually.  You should batch up your responses and manage the
  discussion intelligently.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; Don't get side tracked by how long it will take a feature to reach
  end users.  It will reach them eventually.  You can always supply an
  unofficial patch or maybe create a PECL extension for users of
  current versions of PHP.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; Don't let mail list discussion drag on too long.  High levels of
  discussion can be a symptom that an RFC is contentious.  Having an
  early vote about only the feature's concept can prevent
  over-investment in an RFC and implementation.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; With long, fragmented discussions, not everyone will read every
  email.  Update the RFC at regular intervals, and let people know
  what has changed.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; PHP is popular so you can often find support from "many" people for
  cool language features.  This doesn't mean those features are a
  "good thing" for the language or its implementation.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; There are multiple PHP communities.  Don't interpret support
  in one community as universal support.  Listen carefully to the key
  PHP developers on the "internals" mail list (they may not be the
  ones doing the most discussion).  They are the people who will
  undoubtedly end up doing final integration of the feature (e.g. with
  the op-code cache), fixing edge cases, and maintaining it in the
  long term.  They are the ones that have seen the PHP code base
  complexity grow and become more difficult to maintain and extend.
  Even if they like your idea, they may not be able to contribute time
  and effort to make it stable.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; The PHP core development community needs more end-users to
  become core language developers but the barrier to entry is high
  because of the complexity of the API, and because new features need
  very careful integration with a complex language.  See the point
  above about existing developers not having enough time to support
  every good idea.  This just means you need perseverance to become a
  core developer yourself.  You can gain karma by being a regular code
  contributor before starting your magnum opus RFC.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; Some areas of PHP are complex or niche.  Sometimes feature
  suggestions will be greeted by an apparent lack of interest.  Don't
  be discouraged.  This just means you need to take a stronger
  leadership role, and also prove your credentials by first working on
  the existing code base.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; Keep your RFC updated with a summary of all the positive and
  negative mail list discussion points and examples.&lt;/p&gt;
  &lt;ul&gt;

  &lt;li&gt;This prevents arguments being rehashed on the mail list each year.&lt;/li&gt;

  &lt;li&gt;Documentation will have clear use cases and show what does and
    doesn't work.&lt;/li&gt;

  &lt;li&gt;Future RFC writers can see trends and build on previous ideas.&lt;/li&gt;
  &lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;&lt;p&gt; Before initiating a vote on your RFC, make sure the RFC
  contains enough detail so that the vote is solely on the RFC
  contents, not on any half-remembered or misinterpretable mail list
  discussions.  Un- (or badly) expressed intentions will only cause
  you frustration when your RFC is rejected.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; Don't leave any ambiguity in the RFC.  As well as stating what
   will be changed, also state what won't be changed. Ambiguity will
   hurt the chances of a successful outcome because voters will be
   unsure that the feature has been fully thought through.  Make sure
   there are no "Open Issues" in the RFC when voting. Make a decision
   about the choices before opening the vote, or mark the issues
   clearly as "Future topics for exploration".

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; Make sure any vote is clear about what is being voted on: is
  it the idea, the specification, or the implementation?  Is a
  particular version of PHP being targeted?  Is the implementation
  going to be merged to the core language or made as a PECL extension?

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; Warn the "internals" mail list before starting the vote.  This
  notification gives you a chance to fine tune the wording of your
  poll; this wording has caused contention in the past.  The
  approaching deadline may also cause last-minute RFC responses.
  These may be significant enough to require further discussion.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; Set a deadline for the vote (sadly the current voting RFC doesn't
  require this).  Having a deadline will forestall suggestions that a
  vote was deliberately left open until it succeeded, and then closed
  before the "negative" side could rally support.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; During the voting period, it is common for people to continue
  mail list discussion.  You may need to halt the vote and address any
  issues.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; Prior to the end of the voting period, remind the mail list
  that the vote is about to close.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; Positive voting poll outcomes for RFs that are just "concepts"
  can be interpreted as support for "good ideas" rather than being a
  definitive guarantee that a feature will appear in a future version
  of PHP.  As a feature is later investigated and further discussed,
  the early vote may become irrelevant.  Similarly, where there is no
  chance of an implementation being written, a positive poll outcome
  is just an indicator of desire.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; If your RFC is rejected, it is not the end of the world.
  Sometimes ideas are submitted "before their time", and it takes an
  acclimatization period for other developers to see their value.  As
  the core PHP developer base goes through natural turn-over,
  revisiting an idea after a (long) period may result in different
  appreciation.  (This does not apply to some ideas, for example
  standardizing function names). See the previous points about
  becoming a core contributor - having karma goes a long way towards
  getting an RFC accepted, not only because experienced contributors
  know which RFCs are worth suggesting, and know how to make proposals
  understandable.  When your RFC is rejected, continue working with
  the PHP core development community and revisit the RFC later.

&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt; You can always fork PHP from &lt;a
href="https://github.com/php/php-src" &gt;github&lt;/a&gt;.&lt;/p&gt;

&lt;/ul&gt;
  
&lt;p&gt;In summary, the PHP development process is an organic process and
subject to flexibility. It is based heavily around users contributing
features that they require.  This therefore requires high investment
from users who want change.  Very rarely do PHP core developers have
bandwidth to take on external ideas, no matter how good they are.
Feature acceptance has to be pragmatic. The core PHP contributors
would love to see more people get commit karma and contribute to
PHP.&lt;/p&gt;

&lt;p&gt;This post has gone on long enough. My notes are current for the
time being.  I'm sure there are observations or clarifications you can
make.  If you want to add anything, please post a comment.&lt;/p&gt;


&lt;p&gt;(Note: this page has been augmented and re-ordered since first
being published)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/XA_2yLqPM8M" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/the_mysterious_php_rfc_process</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/os_x_users_11gr2_oracle</guid>
    <title>OS X Users! 11gR2 Oracle Instant Client 32 &amp; 64-bit is now available </title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/Wy5vjy7YtUU/os_x_users_11gr2_oracle</link>
        <pubDate>Fri, 1 Feb 2013 02:15:45 +0000</pubDate>
    <category>php</category>
    <category>apple</category>
    <category>c</category>
    <category>client</category>
    <category>development</category>
    <category>instant</category>
    <category>library</category>
    <category>osx</category>
    <category>tool</category>
            <description>&lt;p&gt;The Oracle 11g Release 2 (11.2.0.3) Database Instant Client for
Apple OS X on Intel x86-64 is now available for download from &lt;a
href="http://www.oracle.com/technetwork/topics/intel-macsoft-096467.html"&gt;OTN&lt;/a&gt;.
It is supported on the two latest OS X releases: Lion (10.7) and
Mountain Lion (10.8).  It provides both 32-bit and 64-bit client
support.&lt;/p&gt;

&lt;p&gt;&lt;a
href="http://www.oracle.com/technetwork/database/features/instant-client/index-100365.html"
&gt;Oracle Instant Client&lt;/a&gt; is a simple bundle of libraries that client
tools and programs (like PHP and Ruby) can link with. This allows
those tools to access Oracle Databases.&lt;/p&gt;

&lt;p&gt;Any issues with Instant Client can be posted to the &lt;a
href="https://forums.oracle.com/forums/forum.jspa?forumID=190" &gt;OTN
Instant Client Forum&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/Wy5vjy7YtUU" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/os_x_users_11gr2_oracle</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/mysql_sessions_at_the_confoo</guid>
    <title>MySQL Sessions at the ConFoo.ca conference</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/0lSmQ76xKEk/mysql_sessions_at_the_confoo</link>
        <pubDate>Wed, 30 Jan 2013 03:10:03 +0000</pubDate>
    <category>php</category>
    <category>canada</category>
    <category>conference</category>
    <category>mysql</category>
    <category>php</category>
            <description>&lt;p&gt;Who says direct marketing doesn't work?  A personal request to blog
the upcoming &lt;a href="http://confoo.ca/en"&gt;ConFoo conference&lt;/a&gt; (25
February - 1 March 2013 in Montreal, Canada) has, as you can see, been
successful.  Although it's been a few years since I spoke there, I
recall how impressive the organization was.  The diversity and
continual growth trajectory of the conference over the years is a very
good indicator that you should be involved.&lt;/p&gt;

&lt;p&gt;While you're there, say Hi to &lt;a
href="https://apex.oracle.com/pls/apex/f?p=19297:4:8620019634929::NO:4:P4_ID:1800"
&gt;Oracle Ace Director&lt;/a&gt; Sheeri Cabral who is giving a couple of &lt;a
href="http://confoo.ca/en/speaker/sheeri-k-cabral"&gt;MySQL
talks&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/0lSmQ76xKEk" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/mysql_sessions_at_the_confoo</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/quick_debugging_of_php_scripts</guid>
    <title>Quick Debugging of PHP Scripts in Emacs with Geben and Xdebug</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/X3k5A9LwGiY/quick_debugging_of_php_scripts</link>
        <pubDate>Thu, 24 Jan 2013 05:25:11 +0000</pubDate>
    <category>php</category>
    <category>debugger</category>
    <category>emacs</category>
    <category>ide</category>
    <category>php</category>
            <description>&lt;p&gt;When you want to test a PHP code snippet quickly, it's handy to do it
within your day-to-day environment.  For me, this environment is
Emacs.  The geben package for Emacs provides an interface to the DBGp
protocol, such as used by Derick Rethans's standard Xdebug extension
for PHP.
&lt;/p&gt;

&lt;p&gt;With the combination of geben and Xdebug, I can quickly and
efficiently step through execution of local files, examining code flow
and data values.
&lt;/p&gt;

&lt;p&gt;Working steps to install and use the debugger on command line PHP
scripts are shown below. They are standard enough that they can be
customized to your actual environment.&lt;/p&gt;

&lt;p&gt;You probably already have Xdebug installed, since it is the common
debugger and profiler used by most IDEs.  Installing geben in Emacs is
straight forward.
&lt;/p&gt;

&lt;p&gt;1. Download PHP 5.4 from &lt;a href="http://php.net/downloads.php" &gt;http://php.net/downloads.php&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2. Install PHP with:&lt;/p&gt;

&lt;pre&gt;$ tar -jxf php-5.4.11.tar.bz2
$ cd php-5.4.11
$ ./configure --prefix=/home/cjones/php54
$ make install
$ cp php.ini-development /home/cjones/php54/lib/php.ini
&lt;/pre&gt;

&lt;p&gt;3. Download the source code for the Xdebug Debugger extension for PHP from &lt;a
href="http://xdebug.org/download.php"
&gt;http://xdebug.org/download.php&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;4. Install Xdebug into PHP with:&lt;/p&gt;

&lt;pre&gt;$ cd /home/cjones
$ tar -zxf xdebug-2.2.1.tgz
$ cd xdebug-2.2.1
$ export PATH=/home/cjones/php54/bin:$PATH
$ phpize
$ ./configure --enable-xdebug --with-php-config=/home/cjones/php54/bin/php-config
$ make install
&lt;/pre&gt;

&lt;p&gt;More information is shown in &lt;a href="http://xdebug.org/docs/install" &gt;http://xdebug.org/docs/install&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5. Edit /home/cjones/php54/lib/php.ini and enable Xdebug by adding these lines:&lt;/p&gt;

&lt;pre&gt;zend_extension=/home/cjones/php54/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
xdebug.remote_enable=on
xdebug.remote_host=127.0.0.1
&lt;/pre&gt;

&lt;p&gt;6. Install geben manually or use the Emacs 24 package repository (M-x
package-list-packages)
&lt;/p&gt;

&lt;p&gt;To manually install geben, download it from
&lt;a href="http://code.google.com/p/geben-on-emacs/downloads/list" &gt;http://code.google.com/p/geben-on-emacs/downloads/list&lt;/a&gt;
and install it with:&lt;/p&gt;

&lt;pre&gt;$ cd /home/cjones
$ tar -zxf geben-0.26.tar.gz
&lt;/pre&gt;

&lt;p&gt;8. Add the following to the Emacs initialization file
/home/cjones/.emacs. When testing this blog post, my .emacs file only
contained this code:
&lt;/p&gt;

&lt;pre&gt;(setq load-path (cons "/home/cjones/geben-0.26" load-path))

(autoload 'geben "geben" "DBGp protocol frontend, a script debugger" t)

;; Debug a simple PHP script.
;; Change the session key my-php-54 to any session key text you like
(defun my-php-debug ()
  "Run current PHP script for debugging with geben"
  (interactive)
  (call-interactively 'geben)
  (shell-command
    (concat "XDEBUG_CONFIG='idekey=my-php-54' /home/cjones/php54/bin/php "
    (buffer-file-name) " &amp;amp;"))
  )

(global-set-key [f5] 'my-php-debug)
&lt;/pre&gt;

&lt;p&gt;Experienced Emacs users will most likely use local-set-key in a
php-mode hook to set a key mapping.
&lt;/p&gt;

&lt;p&gt;9. Start Emacs and load a PHP file:&lt;/p&gt;

&lt;pre&gt;$ emacs my.php
&lt;/pre&gt;

&lt;p&gt;10. Press F5 to start the debugger.  The script will open in geben
mode and can be stepped through with the space bar.&lt;/p&gt;

&lt;p&gt;Geben mode commands can be shown with '?'.  They include 'v' for
showing variables, 'c' for run-to-cursor, and 'g' for completing the
program.&lt;/p&gt;

&lt;p&gt;Geben can also be used for scripts called via a browser.  Start the
geben listener in Emacs with M-x geben and load a script in the
browser, passing an Xdebug URL parameter setting the session name.
This initiates the debug session in Emacs.  E.g. Load
http://localhost/my.php?XDEBUG_SESSION_START=my-php-54&lt;/p&gt;

&lt;p&gt;11. When you are finished debugging, stop the debug server listener
inside Emacs:&lt;/p&gt;

&lt;pre&gt;M-x geben-end&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/X3k5A9LwGiY" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/quick_debugging_of_php_scripts</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/excitement_updated_underground_php_amp</guid>
    <title>Excitement! Updated Underground PHP and Oracle Manual is Available for Download</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/0cVh3gm0etc/excitement_updated_underground_php_amp</link>
        <pubDate>Wed, 12 Dec 2012 00:20:13 +0000</pubDate>
    <category>php</category>
    <category>apache</category>
    <category>best</category>
    <category>book</category>
    <category>connection</category>
    <category>database</category>
    <category>drcp</category>
    <category>edition</category>
    <category>express</category>
    <category>installing</category>
    <category>linux</category>
    <category>manual</category>
    <category>netbeans</category>
    <category>oracle</category>
    <category>performance</category>
    <category>php</category>
    <category>pooling</category>
    <category>practice</category>
    <category>solaris</category>
    <category>timesten</category>
    <category>tuning</category>
    <category>tuxedo</category>
    <category>windows</category>
    <category>xe</category>
            <description>&lt;p&gt;We're thrilled to have a major update of the free &lt;a
href="http://www.oracle.com/technetwork/topics/php/underground-php-oracle-manual-098250.html"&gt;Underground
PHP and Oracle Manual&lt;/a&gt; released on OTN.&lt;/p&gt;

&lt;p&gt;The Underground PHP and Oracle Manual is designed to bridge the gap
between the many PHP scripting language and the many Oracle Database
books available. It contains unique material about PHP's OCI8
extension for Oracle Database, and about other components in the
PHP-Oracle ecosystem. It shows PHP developers how to use PHP and
Oracle together, efficiently and easily.
&lt;/p&gt;

&lt;p&gt;The book has been completely refreshed. It has been updated for
Oracle XE 11g and the latest PHP OCI8 extension. There are new
chapters about using PHP with Oracle TimesTen, NetBeans and
Oracle Tuxedo. There is also a new chapter about installing PHP on Oracle
Solaris. The book now clocks in at 347 pages of great content.&lt;/p&gt;

&lt;p&gt;Acknowledgements are due to all those who have helped with this and
previous editions of the book. Thanks to the product teams that
assisted with brand new content. In particular Craig Mohrman
contributed the chapter about PHP on Solaris.  Jeffry Rubinoff
contributed the base text for the chapter on PHP and NetBeans. &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/0cVh3gm0etc" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/excitement_updated_underground_php_amp</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/adding_dtrace_probes_to_php</guid>
    <title>Adding DTrace Probes to PHP Extensions</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/JtRAborcfic/adding_dtrace_probes_to_php</link>
        <pubDate>Fri, 7 Dec 2012 04:23:39 +0000</pubDate>
    <category>php</category>
    <category>development</category>
    <category>dtrace</category>
    <category>extension</category>
    <category>linux</category>
    <category>monitoring</category>
    <category>performance</category>
    <category>php</category>
    <category>systemtap</category>
    <category>tracing</category>
    <category>tuning</category>
            <description>&lt;p&gt;The powerful DTrace tracing facility has some PHP-specific probes
that can be enabled with --enable-dtrace.&lt;/p&gt;

&lt;p&gt;DTrace for Linux is being created by Oracle and is currently in &lt;a
href="https://blogs.oracle.com/linux/entry/dtrace_for_oracle_linux_news"
&gt;tech preview&lt;/a&gt;.  Currently it doesn't support userspace tracing so,
in the meantime, Systemtap can be used to monitor the probes
implemented in PHP. This was recently outlined in David Soria Parra's
post &lt;a
href="http://blog.experimentalworks.net/2012/12/probing-php-with-systemtap-on-linux/"
&gt;Probing PHP with Systemtap on Linux&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;My post shows how DTrace probes can be added to PHP extensions
and traced on Linux.  I was using Oracle Linux 6.3.&lt;/p&gt;

&lt;p&gt;Not all Linux kernels are built with Systemtap, since this can
impact stability.  Check whether your running kernel (or others
installed) have Systemtap enabled, and reboot with such a kernel:&lt;/p&gt;

&lt;pre&gt;
# grep CONFIG_UTRACE /boot/config-`uname -r`
# grep CONFIG_UTRACE /boot/config-*
&lt;/pre&gt;

&lt;p&gt;When you install Systemtap itself, the package systemtap-sdt-devel
is needed since it provides the sdt.h header file:&lt;/p&gt;

&lt;pre&gt;
# yum install systemtap-sdt-devel
&lt;/pre&gt;

&lt;p&gt;You can now install and build PHP as shown in David's
article. Basically the build is with:&lt;/p&gt;

&lt;pre&gt;
$ cd ~/php-src
$ ./configure --disable-all --enable-dtrace
$ make
&lt;/pre&gt;

&lt;p&gt;(For me, running 'make' a second time failed with an error. The
workaround is to do 'git checkout Zend/zend_dtrace.d' and then rerun
'make'.  See &lt;a href="https://bugs.php.net/bug.php?id=63704" &gt;PHP Bug
63704&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;David's article shows how to trace the probes already implemented
in PHP.  You can also use Systemtap to trace things like userspace PHP
function calls.  For example, create test.php:&lt;/p&gt;

&lt;pre&gt;&amp;lt;?php

$c = oci_connect('hr', 'welcome', 'localhost/orcl');
$s = oci_parse($c, "select dbms_xmlgen.getxml('select * from dual') xml from dual");
$r = oci_execute($s);
$row = oci_fetch_array($s, OCI_NUM);
$x = $row[0]-&amp;gt;load();
$row[0]-&amp;gt;free();
echo $x;

?&amp;gt;
&lt;/pre&gt;

&lt;p&gt;The normal output of this file is the XML form of Oracle's DUAL
table:&lt;/p&gt;

&lt;pre&gt;
$ ./sapi/cli/php ~/test.php
&amp;lt;?xml version="1.0"?&amp;gt;
&amp;lt;ROWSET&amp;gt;
 &amp;lt;ROW&amp;gt;
  &amp;lt;DUMMY&amp;gt;X&amp;lt;/DUMMY&amp;gt;
 &amp;lt;/ROW&amp;gt;
&amp;lt;/ROWSET&amp;gt;
&lt;/pre&gt;

&lt;p&gt;To trace the PHP function calls, create the tracing file
functrace.stp:&lt;/p&gt;

&lt;pre&gt;
probe process("sapi/cli/php").function("zif_*") {
    printf("Started function %s\n", probefunc());
}

probe process("sapi/cli/php").function("zif_*").return {
    printf("Ended function %s\n", probefunc());
}
&lt;/pre&gt;

&lt;p&gt;This makes use of the way PHP userspace functions (not builtins)
like oci_connect() map to C functions with a "zif_" prefix.&lt;/p&gt;

&lt;p&gt;Login as root, and run System tap on the PHP script:&lt;/p&gt;

&lt;pre&gt;
# cd ~cjones/php-src
# stap -c 'sapi/cli/php ~cjones/test.php' ~cjones/functrace.stp
Started function zif_oci_connect
Ended function zif_oci_connect
Started function zif_oci_parse
Ended function zif_oci_parse
Started function zif_oci_execute
Ended function zif_oci_execute
Started function zif_oci_fetch_array
Ended function zif_oci_fetch_array
Started function zif_oci_lob_load
&amp;lt;?xml version="1.0"?&amp;gt;
&amp;lt;ROWSET&amp;gt;
 &amp;lt;ROW&amp;gt;
  &amp;lt;DUMMY&amp;gt;X&amp;lt;/DUMMY&amp;gt;
 &amp;lt;/ROW&amp;gt;
&amp;lt;/ROWSET&amp;gt;
Ended function zif_oci_lob_load
Started function zif_oci_free_descriptor
Ended function zif_oci_free_descriptor
&lt;/pre&gt;

&lt;p&gt;Each call and return is logged.  The Systemtap scripting language
allows complex scripts to be built.  There are many examples on the
web.&lt;/p&gt;

&lt;p&gt;To augment this generic capability and the PHP probes in PHP, other
extensions can have probes too. Below are the steps I used to add
probes to OCI8:&lt;/p&gt;

  &lt;ol&gt;
    
  &lt;li&gt;

    &lt;p&gt;I created a provider file ext/oci8/oci8_dtrace.d, enabling
    three probes.  The first one will accept a parameter that runtime
    tracing can later display:&lt;/p&gt;
    
&lt;pre&gt;
provider php {
	probe oci8__connect(char *username);
	probe oci8__nls_start();
	probe oci8__nls_done();
};
&lt;/pre&gt;
  &lt;/li&gt;

  &lt;li&gt;

  &lt;p&gt;I updated ext/oci8/config.m4 with the PHP_INIT_DTRACE macro. The
  patch is at the end of config.m4.  The macro takes the provider
  prototype file, a name of the header file that 'dtrace' will
  generate, and a list of sources files with probes.  When
  --enable-dtrace is used during PHP configuration, then the outer
  $PHP_DTRACE check is true and my new probes will be enabled. I've
  chosen to define an OCI8 specific macro, HAVE_OCI8_DTRACE, which can
  be used in the OCI8 source code:&lt;/p&gt;

&lt;pre&gt;
diff --git a/ext/oci8/config.m4 b/ext/oci8/config.m4
index 34ae76c..f3e583d 100644
--- a/ext/oci8/config.m4
+++ b/ext/oci8/config.m4
@@ -341,4 +341,17 @@ if test "$PHP_OCI8" != "no"; then
     PHP_SUBST_OLD(OCI8_ORACLE_VERSION)
 
   fi
+
+  if test "$PHP_DTRACE" = "yes"; then
+     AC_CHECK_HEADERS([sys/sdt.h], [
+       PHP_INIT_DTRACE([ext/oci8/oci8_dtrace.d],
+                       [ext/oci8/oci8_dtrace_gen.h],[ext/oci8/oci8.c])
+         AC_DEFINE(HAVE_OCI8_DTRACE,1,
+         [Whether to enable DTrace support for OCI8 ])
+     ], [
+       AC_MSG_ERROR(
+         [Cannot find sys/sdt.h which is required for DTrace support])
+     ])
+   fi
+
 fi
&lt;/pre&gt;
  &lt;/li&gt;

  &lt;li&gt;

    &lt;p&gt;In ext/oci8/oci8.c, I added the probes at, for this example,
    semi-arbitrary places:&lt;/p&gt;
    
&lt;pre&gt;
diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c
index e2241cf..ffa0168 100644
--- a/ext/oci8/oci8.c
+++ b/ext/oci8/oci8.c
@@ -1811,6 +1811,12 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char
 		}
 	}
 
+#ifdef HAVE_OCI8_DTRACE
+    if (DTRACE_OCI8_CONNECT_ENABLED()) {
+		DTRACE_OCI8_CONNECT(username);
+	}
+#endif
+
 	/* Initialize global handles if they weren't initialized before */
 	if (OCI_G(env) == NULL) {
 		php_oci_init_global_handles(TSRMLS_C);
@@ -1870,11 +1876,22 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char
 		size_t rsize = 0;
 		sword result;
 
+#ifdef HAVE_OCI8_DTRACE
+		if (DTRACE_OCI8_NLS_START_ENABLED()) {
+			DTRACE_OCI8_NLS_START();
+		}
+#endif
 		PHP_OCI_CALL_RETURN(result, OCINlsEnvironmentVariableGet, (&amp;amp;charsetid_nls_lang, 0, OCI_NLS_CHARSET_ID, 0, &amp;amp;rsize));
 		if (result != OCI_SUCCESS) {
 			charsetid_nls_lang = 0;
 		}
 		smart_str_append_unsigned_ex(&amp;amp;hashed_details, charsetid_nls_lang, 0);
+
+#ifdef HAVE_OCI8_DTRACE
+		if (DTRACE_OCI8_NLS_DONE_ENABLED()) {
+			DTRACE_OCI8_NLS_DONE();
+		}
+#endif
 	}
 
 	timestamp = time(NULL);
&lt;/pre&gt;

&lt;p&gt;The oci_connect(), oci_pconnect() and oci_new_connect() calls all
use php_oci_do_connect_ex() internally.  The first probe simply
records that the PHP application made a connection call. I already
showed a way to do this without needing a probe, but adding a specific
probe lets me record the username.  The other two probes can be used
to time how long the globalization initialization takes. &lt;/p&gt;

&lt;p&gt;The relationships between the oci8_dtrace.d names like
oci8__connect, the probe guards like DTRACE_OCI8_CONNECT_ENABLED() and
probe names like DTRACE_OCI8_CONNECT() are obvious after
seeing the pattern of all three probes.&lt;/p&gt;

&lt;p&gt;I included the new header that will be automatically created by the
dtrace tool when PHP is built.  I did this in
ext/oci8/php_oci8_int.h:&lt;/p&gt;
    
&lt;pre&gt;
diff --git a/ext/oci8/php_oci8_int.h b/ext/oci8/php_oci8_int.h
index b0d6516..c81fc5a 100644
--- a/ext/oci8/php_oci8_int.h
+++ b/ext/oci8/php_oci8_int.h
@@ -44,6 +44,10 @@
 #  endif
 # endif /* osf alpha */
 
+#ifdef HAVE_OCI8_DTRACE
+#include "oci8_dtrace_gen.h"
+#endif
+
 #if defined(min)
 #undef min
 #endif
&lt;/pre&gt;    
    
  &lt;/li&gt;

  &lt;li&gt;&lt;p&gt;Now PHP can be rebuilt:&lt;/p&gt;
&lt;pre&gt;
$ cd ~/php-src
$ rm configure &amp;&amp; ./buildconf --force
$ ./configure --disable-all --enable-dtrace \
              --with-oci8=instantclient,/home/cjones/instantclient
$ make
&lt;/pre&gt;

&lt;p&gt;If 'make' fails, do the 'git checkout Zend/zend_dtrace.d' trick I mentioned.&lt;/p&gt;
  &lt;/li&gt;


  &lt;li&gt;
    &lt;p&gt;The new probes can be seen by logging in as root and running:&lt;/p&gt;
&lt;pre&gt;
# stap -l 'process.provider("php").mark("oci8*")' -c 'sapi/cli/php -i'
process("sapi/cli/php").provider("php").mark("oci8__connect")
process("sapi/cli/php").provider("php").mark("oci8__nls_done")
process("sapi/cli/php").provider("php").mark("oci8__nls_start")
&lt;/pre&gt;    
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;To test them out, create a new trace file, oci.stp:&lt;/p&gt;
&lt;pre&gt;
global numconnects;
global start;
global numcharlookups = 0;
global tottime = 0;
probe process.provider("php").mark("oci8-connect") {
    printf("Connected as %s\n", user_string($arg1));
    numconnects += 1;
}
probe process.provider("php").mark("oci8-nls_start") {
    start = gettimeofday_us();
    numcharlookups++;
}
probe process.provider("php").mark("oci8-nls_done") {
    tottime += gettimeofday_us() - start;
}
probe end {
    printf("Connects: %d, Charset lookups: %ld\n", numconnects, numcharlookups);
    printf("Total NLS charset initalization time: %ld usecs/connect\n", 
                        (numcharlookups &gt; 0 ? tottime/numcharlookups : 0));
}
&lt;/pre&gt;

    &lt;p&gt;This calculates the average time that the NLS character set
    lookup takes. It also prints out the username of each connection,
    as an example of using parameters.&lt;/p&gt;
    
  &lt;/li&gt;
  
  &lt;li&gt;
&lt;p&gt;Login as root and run Systemtap over the PHP script:&lt;/p&gt;
&lt;pre&gt;# cd ~cjones/php-src
# stap -c 'sapi/cli/php ~cjones/test.php' ~cjones/oci.stp
Connected as cj
&amp;lt;?xml version="1.0"?&amp;gt;
&amp;lt;ROWSET&amp;gt;
 &amp;lt;ROW&amp;gt;
  &amp;lt;DUMMY&amp;gt;X&amp;lt;/DUMMY&amp;gt;
 &amp;lt;/ROW&amp;gt;
&amp;lt;/ROWSET&amp;gt;
Connects: 1, Charset lookups: 1
Total NLS charset initalization time: 164 usecs/connect
&lt;/pre&gt;

&lt;p&gt;This shows the time penalty of making OCI8 look up the default
character set. This time would be zero if a character set had been
passed as the fourth argument to oci_connect() in test.php.&lt;/p&gt; &lt;/li&gt;
  
&lt;/ol&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/JtRAborcfic" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/adding_dtrace_probes_to_php</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/how_and_when_to_move</guid>
    <title>How (and when) to move users to mysqli and PDO_MYSQL?</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/lc4AHzCQ2wg/how_and_when_to_move</link>
        <pubDate>Mon, 26 Nov 2012 06:21:27 +0000</pubDate>
    <category>php</category>
    <category>migration</category>
    <category>mysql</category>
    <category>php</category>
            <description>&lt;p&gt;An important discussion on the PHP &lt;a href="http://news.php.net/group.php?group=php.internals"&gt;"internals"&lt;/a&gt; development mailing list  is taking place.  It's one that you should take some note of.  It concerns the next step in transitioning PHP applications away from the very old &lt;b&gt;mysql&lt;/b&gt; extension and towards adopting the much better &lt;b&gt;mysqli&lt;/b&gt; extension or &lt;b&gt;PDO_MYSQL&lt;/b&gt; driver for PDO.  This would allow the &lt;b&gt;mysql&lt;/b&gt; extension to, at some as-yet undetermined time in the future, be removed.  Both mysqli and PDO_MYSQL have been around for many years, and have various advantages: &lt;a href="http://php.net/manual/en/mysqlinfo.api.choosing.php" &gt;http://php.net/manual/en/mysqlinfo.api.choosing.php&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The initial RFC for this next step is at &lt;a href="https://wiki.php.net/rfc/mysql_deprecation" &gt;https://wiki.php.net/rfc/mysql_deprecation&lt;/a&gt; I would expect the RFC to change substantially based on current discussion.  The crux of that discussion is the timing of the next step of deprecation.  There is also discussion of the carrot approach (showing users the benfits of moving), and stick approach (displaying warnings when the &lt;b&gt;mysql&lt;/b&gt; extension is used). As always, there is a lot of guesswork going on as to what MySQL APIs are in current use by PHP applications, how those applications are deployed, and what their upgrade cycle is.  This is where you can add your weight to the discussion - and also help by spreading the word to move to &lt;b&gt;mysqli&lt;/b&gt; or &lt;b&gt;PDO_MYSQL&lt;/b&gt;.  An example of such a 'carrot' is the excellent summary at Ulf Wendel's blog: &lt;a href="http://blog.ulf-wendel.de/2012/php-mysql-why-to-upgrade-extmysql/" &gt;http://blog.ulf-wendel.de/2012/php-mysql-why-to-upgrade-extmysql/&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;I want to repeat that no time frame for the eventual removal of the &lt;b&gt;mysql&lt;/b&gt; extension is set.  I expect it to be some years away.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/lc4AHzCQ2wg" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/how_and_when_to_move</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/scripting_language_sessions_at_oracle</guid>
    <title>Scripting Language Sessions at Oracle OpenWorld and MySQL Connect, 2012</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/a_SgwrTWB4c/scripting_language_sessions_at_oracle</link>
        <pubDate>Thu, 13 Sep 2012 06:57:04 +0000</pubDate>
    <category>php</category>
            <description>&lt;p&gt;This posts highlights some great scripting language sessions coming
up at the Oracle OpenWorld and MySQL Connect conferences.  These
events are happening in San Francisco from the end of September. You
can search for other interesting conference sessions in the &lt;a
href="https://oracleus.activeevents.com/connect/search.ww?event=openworld"
&gt;Content Catalog&lt;/a&gt;.  Also check out what is happening at JavaOne in
that event's &lt;a
href="https://oracleus.activeevents.com/connect/search.ww?event=javaone"
&gt;Content Catalog&lt;/a&gt; (I haven't included sessions from it in this
post.)&lt;/p&gt;

&lt;p&gt;To find the timeslots and locations of each session, click their
respective link and check the "Session Schedule" box on the top
right. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=8431" &gt;GEN8431 - General Session: What’s New in Oracle Database Application Development&lt;/a&gt;

This general session takes a look at what’s been new in the last year
in Oracle Database application development tools using the latest
generation of database technology. Topics range from Oracle SQL
Developer and Oracle Application Express to Java and PHP. (&lt;i&gt;Thomas
Kyte - Architect, Oracle&lt;/i&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=9858" &gt;BOF9858 - Meet the Developers of Database Access Services (OCI, ODBC, DRCP, PHP, Python)&lt;/a&gt;

This session is your opportunity to meet in person the Oracle
developers who have built Oracle Database access tools and products
such as the Oracle Call Interface (OCI), Oracle C++ Call Interface
(OCCI), and Open Database Connectivity (ODBC) drivers; Transparent
Application Failover (TAF); Oracle Database Instant Client; Database
Resident Connection Pool (DRCP); Oracle Net Services, and so on. The
team also works with those who develop the PHP, Ruby, Python, and Perl
adapters for Oracle Database. Come discuss with them the features you
like, your pains, and new product enhancements in the latest database
technology.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=8506" &gt;CON8506 - Syndication and Consolidation: Oracle Database Driver for MySQL Applications&lt;/a&gt;

This technical session presents a new Oracle Database driver that
enables you to run MySQL applications (written in PHP, Perl, C, C++,
and so on) against Oracle Database with almost no code change. Use
cases for such a driver include application syndication such as
interoperability across a relationship database management system,
application migration, and database consolidation. In addition, the
session covers enhancements in database technology that enable and
simplify the migration of third-party databases and applications to
and consolidation with Oracle Database. Attend this session to learn
more and see a live demo. (&lt;i&gt;Srinath Krishnaswamy - Director,
Software Development, Oracle.  Kuassi Mensah - Director Product
Management, Oracle.  Mohammad Lari - Principal Technical Staff, Oracle
&lt;/i&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=10068" &gt;HOL10068 - Run MySQL Applications Against the Latest Oracle Database Technology&lt;/a&gt;
Have you ever wanted to run the same applications against both MySQL
and Oracle Database or migrate MySQL applications to Oracle Database?
MySQL DBAs, Oracle DBAs, MySQL developers, Oracle developers:
participate in this hands-on lab to learn the commonalities and
differences between MySQL and Oracle Database in terms of database
types, DDL, and SQL syntax and then deploy and run a MySQL application
(almost) unchanged against an Oracle Database instance. The lab
preinstalls both MySQL and Oracle Database and furnishes a running
MySQL application and a few step-by-step instructions for deploying
and running it against the latest Oracle Database release. (&lt;i&gt;Srinath
Krishnaswamy - Director, Software Development, Oracle.  Kuassi Mensah
- Director Product Management, Oracle.  Christopher Jones - Consulting
Technical Staff, Oracle.  Mohammad Lari - Principal Technical Staff,
Oracle&lt;/i&gt; ) &lt;/p&gt;

&lt;p&gt;&lt;a href="https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=9167" &gt;CON9167 - Current State of PHP and MySQL&lt;/a&gt;

Together, PHP and MySQL power large parts of the Web. The developers
of both technologies continue to enhance their software to ensure that
developers can be satisfied despite all their changing and growing
needs. This session presents an overview of changes in PHP 5.4, which
was released earlier this year and shows you various new MySQL-related
features available for PHP, from transparent client-side caching to
direct support for scaling and high-availability needs. (&lt;i&gt;Johannes
Schlüter - SoftwareDeveloper, Oracle&lt;/i&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=8983" &gt;CON8983 - Sharding with PHP and MySQL&lt;/a&gt;

In deploying MySQL, scale-out techniques can be used to scale out
reads, but for scaling out writes, other techniques have to be
used. To distribute writes over a cluster, it is necessary to shard
the database and store the shards on separate servers. This session
provides a brief introduction to traditional MySQL scale-out
techniques in preparation for a discussion on the different sharding
techniques that can be used with MySQL server and how they can be
implemented with PHP. You will learn about static and dynamic sharding
schemes, their advantages and drawbacks, techniques for locating and
moving shards, and techniques for resharding. (&lt;i&gt;Mats Kindahl -
Senior Principal Software Developer, Oracle&lt;/i&gt;) &lt;/p&gt;

&lt;p&gt;&lt;a href="https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=9268" &gt;CON9268 - Developing Python Applications with MySQL Utilities and MySQL Connector/Python&lt;/a&gt;

This session discusses MySQL Connector/Python and the MySQL Utilities
component of MySQL Workbench and explains how to write MySQL
applications in Python. It includes in-depth explanations of the
features of MySQL Connector/Python and the MySQL Utilities library,
along with example code to illustrate the concepts. Those interested
in learning how to expand or build their own utilities and connector
features will benefit from the tips and tricks from the experts. This
session also provides an opportunity to meet directly with the
engineers and provide feedback on your issues and priorities. You can
learn what exists today and influence future developments.
(&lt;i&gt;Geert Vanderkelen - Software Developer, Oracle&lt;/i&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=9141" &gt;BOF9141 - MySQL Utilities and MySQL Connector/Python: Python Developers, Unite!&lt;/a&gt;

Come to this lively discussion of the MySQL Utilities component of
MySQL Workbench and MySQL Connector/Python. It includes in-depth
explanations of the features and dives into the code for those
interested in learning how to expand or build their own utilities and
connector features. This is an audience-driven session, so put on your
best Python shirt and let’s talk about MySQL Utilities and MySQL
Connector/Python. (&lt;i&gt;Geert Vanderkelen - Software Developer, Oracle.
Charles Bell - Senior Software Developer, Oracle&lt;/i&gt;)
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=3290" &gt;CON3290 - Integrating Oracle Database with a Social Network&lt;/a&gt;

Facebook, Flickr, YouTube, Google Maps. There are many social network
sites, each with their own APIs for sharing data with them. Most
developers do not realize that Oracle Database has base tools for
communicating with these sites, enabling all manner of information,
including multimedia, to be passed back and forth between the
sites. This technical presentation goes through the methods in PL/SQL
for connecting to, and then sending and retrieving, all types of data
between these sites. (&lt;i&gt;Marcelle Kratochvil - CTO, Piction&lt;/i&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=3291" &gt;CON3291 - Storing and Tuning Unstructured Data and Multimedia in Oracle Database&lt;/a&gt;

Database administrators need to learn new skills and techniques when
the decision is made in their organization to let Oracle Database
manage its unstructured data. They will face new scalability
challenges. A single row in a table can become larger than a whole
database. This presentation covers the techniques a DBA needs for
managing the large volume of data in a standard Oracle Database
instance. (&lt;i&gt;Marcelle Kratochvil - CTO, Piction&lt;/i&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=3292" &gt;CON3292 - Using PHP, Perl, Visual Basic, Ruby, and Python for Multimedia in Oracle Database&lt;/a&gt;

These five programming languages are just some of the most popular
ones in use at the moment in the marketplace. This presentation
details how you can use them to access and retrieve multimedia from
Oracle Database. It covers programming techniques and methods for
achieving faster development against Oracle Database. (&lt;i&gt;Marcelle
Kratochvil - CTO, Piction&lt;/i&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=5181" &gt;UGF5181 - Building Real-World Oracle DBA Tools in Perl&lt;/a&gt;

Perl is not normally associated with building mission-critical
application or DBA tools. Learn why Perl could be a good choice for
building your next killer DBA app. This session draws on real-world
experience of building DBA tools in Perl, showing the framework and
architecture needed to deal with portability, efficiency, and
maintainability.  Topics include Perl frameworks; Which Comprehensive
Perl Archive Network (CPAN) modules are good to use; Perl and CPAN
module licensing; Perl and Oracle connectivity; Compiling and
deploying your app; An example of what is possible with
Perl. (&lt;i&gt;Arjen Visser - CEO &amp; CTO, Dbvisit Software Limited&lt;/i&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=3153" &gt;CON3153 - Perl: A DBA’s and Developer’s Best (Forgotten) Friend&lt;/a&gt;

This session reintroduces Perl as a language of choice for many
solutions for DBAs and developers. Discover what makes Perl so
successful and why it is so versatile in our day-to-day lives. Perl
can automate all those manual tasks and is truly
platform-independent. Perl may not be in the limelight the way other
languages are, but it is a remarkable language, it is still very
current with ongoing development, and it has amazing online
resources. Learn what makes Perl so great (including CPAN), get an
introduction to Perl language syntax, find out what you can use Perl
for, hear how Oracle uses Perl, discover the best way to learn Perl,
and take away a small Perl project challenge. (&lt;i&gt;Arjen Visser - CEO &amp;
CTO, Dbvisit Software Limited&lt;/i&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=10332" &gt;CON10332 - Oracle RightNow CX Cloud Service’s Connect PHP API: Intro, What’s New, and Roadmap&lt;/a&gt;

Connect PHP is a public API that enables developers to build
solutions with the Oracle RightNow CX Cloud Service platform. This API
is used primarily by developers working within the Oracle RightNow
Customer Portal Cloud Service framework who are looking to gain access
to data and services hosted by the Oracle RightNow CX Cloud Service
platform through a backward-compatible API. Connect for PHP leverages
the same data model and services as the Connect Web Services for SOAP
API. Come to this session to get an introduction and learn what’s new
and what’s coming up. &lt;i&gt;(Mark Rhoads - Senior Principal Applications Engineer, Oracle.
Mark Ericson - Sr. Principle Product Manager, Oracle)
&lt;/i&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a
href="https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=10330"
&gt;CON10330 - Oracle RightNow CX Cloud Service APIs and Frameworks
Overview&lt;/a&gt; Oracle RightNow CX Cloud Service APIs are available in
the following areas: desktop UI, Web services, customer portal, PHP,
and knowledge. These frameworks provide access to Oracle RightNow CX
Cloud Service’s Connect Common Object Model and custom objects. This
session provides a broad overview of capabilities in all these
areas. (&lt;i&gt;Mark Ericson - Sr. Principle Product Manager,
Oracle&lt;/i&gt;)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/a_SgwrTWB4c" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/scripting_language_sessions_at_oracle</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/netbeans_php_community_council</guid>
    <title>NetBeans PHP Community Council</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/9IZxJdCu_CE/netbeans_php_community_council</link>
        <pubDate>Tue, 11 Sep 2012 05:30:52 +0000</pubDate>
    <category>php</category>
            <description>&lt;p&gt;A new NetBeans PHP Community Council offers a chance to contribute
to NetBeans.  A guest post by Timur Poperecinii on the NetBeans blog
&lt;a
href="https://blogs.oracle.com/netbeansphp/entry/netbeans_php_community_council"
&gt;explains&lt;/a&gt; the council.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/9IZxJdCu_CE" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/netbeans_php_community_council</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/using_the_php_cli_webserver</guid>
    <title>Using the PHP CLI Webserver to Identify and Test Memory Issues in PHP</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/eRXb31sQ3p0/using_the_php_cli_webserver</link>
        <pubDate>Tue, 14 Aug 2012 22:34:53 +0000</pubDate>
    <category>php</category>
            <description>&lt;p&gt;The &lt;a href="http://php.net/manual/en/features.commandline.webserver.php"&gt;PHP 5.4 CLI webserver&lt;/a&gt; is being used more and more to identify and
resolve PHP bugs.  Following on from the CLI webserver tests that
Xinchen Hui (aka "laruence") instigated for the PHP 5.4 release,
Anatoliy Belsky (aka "weltling") begain adding CLI webserver tests for
the APC package, which is currently undergoing some much needed fixups
for PHP 5.4.
&lt;/p&gt;

&lt;p&gt;Rasmus Lerdorf has also been running some of the PHP command line
tests through the CLI web server to identify crashes and memory
corruption issues that the existing one-test-per-process tests can't
identify.  Even today a fix for a session issue was merged by
Laruence.  The symptom would have been a random crash that would have
been very hard to reproduce and explain to the PHP developers.
&lt;/p&gt;

&lt;p&gt;Rasmus mentioned on IRC how he ran the tests: simply renaming the
".phpt" test files as ".php", and invoking them through the CLI
webserver.  The SKIPIF sections get executed, but that doesn't affect
the desired outcome of testing multiple HTTP requests with different
input scripts.  &lt;/p&gt;

&lt;p&gt;Below are some quick shell scripts I put together to automate testing
the OCI8 extension with valgrind.
&lt;/p&gt;

&lt;p&gt;There are three scripts.  The first creates a copy of all OCI8 tests with
names changed to ".php":&lt;/p&gt;

&lt;pre&gt;
    #!/bin/sh
    # NAME:    setup_tests.sh
    # PURPOSE: Copy .phpt files as .php
    #          Assumes a clean PHP-5.4 branch with no tests/*.diff files

    SD=$HOME/php-5.4/ext/oci8/tests

    cd /tmp &amp;amp;&amp;amp; rm -rf tests &amp;amp;&amp;amp; mkdir tests

    for F in $(echo $SD/*)
    do
        if [ "${F##*.}" = "phpt" ]; then
            # sym link with a .php file extension instead of .phpt
            N=$(basename $F .phpt).php
        else
            # sym link the unchanged filename
            N=$(basename $F)
        fi
        ln -s $F tests/$N
    done
&lt;/pre&gt;

&lt;p&gt;The second script starts the PHP CLI webserver:&lt;/p&gt;

&lt;pre&gt;
    #!/bin/sh
    # NAME:    start_ws.sh
    # PURPOSE: Start the CLI webserver

    PHP="$HOME/phpbuild/php54/sapi/cli/php"
    PHPOPTS="-d max_execution_time=600 -d log_errors=Off"
    PORT=4444
    VALGRIND=valgrind
    VALGRINDOPTS=" --tool=memcheck --suppressions=$HOME/.valgrind_supp"

    USE_ZEND_ALLOC=0 $VALGRIND $VALGRINDOPTS $PHP $PHPOPTS \
                               -t /tmp/tests -S localhost:$PORT
&lt;/pre&gt;

&lt;p&gt;Here I'm running valgrind to check for memory issues.  I set the
execution time large, because several of the OCI8 tests take time,
especially with valgrind.&lt;/p&gt;

&lt;p&gt;The third script invokes all PHP tests sequentially:&lt;/p&gt;

&lt;pre&gt;
    #!/bin/sh
    # NAME:    wg_all.sh
    # PURPOSE: Load all .php scripts sequentially

    PORT=4444

    cd /tmp/tests

    for F in *.php
    do
        wget -O /tmp/L.php_cli_test http://localhost:$PORT/$F
    done
&lt;/pre&gt;

&lt;p&gt;You can change this script to call subsets of your own scripts, or
repeatedly call scripts to check memory usage and cleanup code.
&lt;/p&gt;

&lt;p&gt;To use the scripts, start the webserver and wait for it to initialize:
&lt;/p&gt;
&lt;pre&gt;
    $ ./start_ws.sh 
    ==14170== Memcheck, a memory error detector
    ==14170== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
    ==14170== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info
    ==14170== Command: php -d max_execution_time=600 -d log_errors=Off -t /tmp/tests -S localhost:4444
    ==14170== 
    PHP 5.4.5-dev Development Server started at Tue Aug 14 14:53:34 2012
    Listening on http://localhost:4444
    Document root is /tmp/tests
    Press Ctrl-C to quit.
&lt;/pre&gt;

&lt;p&gt;This sits, waiting to handle requests.  &lt;/p&gt;

&lt;p&gt;In a second terminal run wg_all.sh to initiate requests:&lt;/p&gt;

&lt;pre&gt;
    $ ./wg_all.sh
    --2012-08-14 14:38:41--  http://localhost:4444/tests/array_bind_001.php
    Resolving localhost... 127.0.0.1
    Connecting to localhost|127.0.0.1|:4444... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: unspecified [text/html]
    Saving to: `/tmp/L.php_cli_test'

        [ &amp;lt;=&amp;gt;                                   ] 707         --.-K/s   in 0.003s  

    2012-08-14 14:38:44 (231 KB/s) - `/tmp/L.php_cli_test' saved [707]
    . . .
&lt;/pre&gt;

&lt;p&gt;You could suppress this output by adding the option "-o
/tmp/L.wg_output" to wg_all.sh.  I didn't add it because, although I'm
ignoring output, I like to see that the tests are really returning
something.&lt;/p&gt;

&lt;p&gt;The first terminal running the CLI web server shows each requested script:&lt;/p&gt;

&lt;pre&gt;
    [Tue Aug 14 14:35:06 2012] 127.0.0.1:34006 [200]: /tests/array_bind_001.php
    [Tue Aug 14 14:35:06 2012] 127.0.0.1:34008 [200]: /tests/array_bind_002.php
    [Tue Aug 14 14:35:07 2012] 127.0.0.1:34010 [200]: /tests/array_bind_003.php
    [Tue Aug 14 14:35:07 2012] 127.0.0.1:34013 [200]: /tests/array_bind_004.php
    [Tue Aug 14 14:35:07 2012] 127.0.0.1:34015 [200]: /tests/array_bind_005.php
    [Tue Aug 14 14:35:07 2012] 127.0.0.1:34017 [200]: /tests/array_bind_006.php
    [Tue Aug 14 14:35:07 2012] 127.0.0.1:34019 [200]: /tests/array_bind_007.php
    [Tue Aug 14 14:35:08 2012] 127.0.0.1:34021 [200]: /tests/array_bind_008.php
    . . .
&lt;/pre&gt;

&lt;p&gt;This is the output stream to monitor for valgrind issues.&lt;/p&gt;

&lt;p&gt;You can remove the wget "-O /tmp/L.php_cli_test" option if you want to see the returned
output from each test, e.g. to check that the tests are connecting to
the database correctly.
&lt;/p&gt;

&lt;p&gt;Removing the php "-d log_errors=Off" option will show you errors in
the CLI web server output.  Many tests deliberately create errors, but
issues with .phpt SKIPIF sections will be more obvious.
&lt;/p&gt;

&lt;p&gt;You can customize these scripts for your applications and help
discover reproducible PHP bugs.  With valid test cases, the PHP
development team has a much better chance of resolving any problems.
&lt;/p&gt;

&lt;/body&gt;
&lt;/html&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/eRXb31sQ3p0" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/using_the_php_cli_webserver</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/php_fpm_fastcgi_process_manager</guid>
    <title>PHP-FPM FastCGI Process Manager with Apache 2</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/nlY3egHpBq8/php_fpm_fastcgi_process_manager</link>
        <pubDate>Tue, 13 Mar 2012 23:00:00 +0000</pubDate>
    <category>php</category>
    <category>apache</category>
    <category>fastcgi</category>
    <category>php</category>
    <category>php-fpm</category>
    <category>server</category>
    <category>web</category>
            <description>&lt;p&gt;I've &lt;a href="https://blogs.oracle.com/opal/entry/php_5_4_0_rpms"
&gt;published some vanilla PHP 5.4.0 RPMs&lt;/a&gt; to make new feature testing
easier.&lt;/p&gt;

&lt;p&gt;Along with all the PHP 5.4 goodies, the php-fpm "FastCGI Process
Manager" is available for the first time on oss.oracle.com.  Php-fpm
is an alternative FastCGI interface to PHP with various extra features
such as load dependent spawning of processes.  (For other features,
see &lt;a href="http://php-fpm.org/"&gt;php-fpm.org&lt;/a&gt;).  Php-fpm
has been getting more and more traction in the PHP community and the
EXPERIMENTAL flag was removed in PHP 5.4.  You might want to test it
out.&lt;/p&gt;

&lt;p&gt;To use php-fpm with the default Apache web server, first install
Oracle Linux 5.8 (64bit) using Oracle's free, public yum repository &lt;a
href="http://public-yum.oracle.com/"
&gt;public-yum.oracle.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Install Apache, if not already installed:&lt;/p&gt;

&lt;pre&gt;
  yum install httpd
&lt;/pre&gt;

&lt;p&gt;Download and install the PHP 5.4 RPMs from &lt;a
href="http://oss.oracle.com/projects/php/"
&gt;oss.oracle.com/projects/php&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;
  rpm -i php54-common-5.4.0-1.el5.x86_64.rpm php54-fpm-5.4.0-1.el5.x86_64.rpm
&lt;/pre&gt;

&lt;p&gt;Other extensions can also be installed, depending on the functionality
you want to test.&lt;/p&gt;

&lt;p&gt;Download and build FastCGI for Apache:&lt;/p&gt;

&lt;pre&gt;
  wget http://www.fastcgi.com/dist/mod_fastcgi-current.tar.gz
  tar -zxf mod_fastcgi-current.tar.gz
  cd mod_fastcgi-2.4.6
  cp Makefile.AP2 Makefile
  make top_dir=/usr/lib64/httpd
&lt;/pre&gt;

&lt;p&gt;Install FastCGI as root:&lt;/p&gt;

&lt;pre&gt;
  make top_dir=/usr/lib64/httpd install
&lt;/pre&gt;

&lt;p&gt;Edit &lt;code&gt;/etc/httpd/conf/httpd.conf&lt;/code&gt; and comment out any
existing references to PHP you might previously have added for
testing: &lt;/p&gt;

&lt;pre&gt;
# LoadModule php5_module        modules/libphp5.so
# AddType application/x-httpd-php .php
&lt;/pre&gt;

&lt;p&gt;Add the php-fpm configuration to &lt;code&gt;httpd.conf&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;
  LoadModule fastcgi_module modules/mod_fastcgi.so

  &amp;lt;IfModule mod_fastcgi.c&amp;gt;  
    FastCGIExternalServer /usr/sbin/php-fpm -host 127.0.0.1:9000
    AddHandler php-fastcgi .php  

    #&amp;lt;LocationMatch "/status"&amp;gt;
    #  SetHandler php-fastcgi-virt
    #  Action php-fastcgi-virt /usr/sbin/php-fpm.fcgi virtual
    #&amp;lt;/LocationMatch&amp;gt;

    Action php-fastcgi /usr/sbin/php-fpm.fcgi  
    ScriptAlias /usr/sbin/php-fpm.fcgi /usr/sbin/php-fpm  

    &amp;lt;Directory /usr/sbin&amp;gt;  
      Options ExecCGI FollowSymLinks  
      SetHandler fastcgi-script  
      Order allow,deny  
      Allow from all  
    &amp;lt;/Directory&amp;gt;  
  &amp;lt;/IfModule&amp;gt; 
&lt;/pre&gt;

&lt;p&gt;Start php-fpm and Apache:&lt;/p&gt;

&lt;pre&gt;
  service php-fpm start
  service httpd start
&lt;/pre&gt;

&lt;p&gt;Test it out with your favorite script or create a file &lt;code&gt;pi.php&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;
  &amp;lt;?php
    phpinfo();
  ?&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Save it in &lt;code&gt;/var/www/html/pi.php&lt;/code&gt; or in
&lt;code&gt;$HOME/public_html/pi.php&lt;/code&gt;, if you have configured
&lt;code&gt;UserDir&lt;/code&gt; in &lt;code&gt;httpd.conf&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In a browser load &lt;code&gt;http://localhost/pi.php&lt;/code&gt; or
&lt;code&gt;http://localhost/~yourname/pi.php&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This will show the PHP configuration values.&lt;/p&gt;

&lt;p&gt;To test php-fpm's built-in statistics, edit &lt;code&gt;httpd.conf&lt;/code&gt;
and uncomment the four lines of the &lt;code&gt;LocationMatch&lt;/code&gt;
section:&lt;/p&gt;

&lt;pre&gt;
  &amp;lt;LocationMatch "/status"&amp;gt;
    SetHandler php-fastcgi-virt
    Action php-fastcgi-virt /usr/sbin/php-fpm.fcgi virtual
  &amp;lt;/LocationMatch&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Edit &lt;code&gt;/etc/php-fpm.conf&lt;/code&gt; and uncomment the line:&lt;/p&gt;

&lt;pre&gt;
  pm.status_path = /status
&lt;/pre&gt;

&lt;p&gt;Restart php-fpm and Apache:&lt;/p&gt;

&lt;pre&gt;
  service php-fpm restart
  service httpd restart
&lt;/pre&gt;

&lt;p&gt;Run some load on the system:&lt;/p&gt;

&lt;pre&gt;
  ab -c 10 -t 60 http://localhost/pi.php  
&lt;/pre&gt;

&lt;p&gt;Now &lt;code&gt;http://localhost/status&lt;/code&gt; gives you the status of the server:&lt;/p&gt;

&lt;pre&gt;
  pool:                 www
  process manager:      dynamic
  start time:           13/Mar/2012:14:25:53 -0700
  start since:          26
  accepted conn:        50001
  listen queue:         0
  max listen queue:     6
  listen queue len:     128
  idle processes:       2
  active processes:     1
  total processes:      3
  max active processes: 5
  max children reached: 1
&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;php-fpm.conf&lt;/code&gt; file documents other output formats
for the statistics.  It also shows the extensive functionality
available with php-fpm.&lt;/p&gt;

&lt;p&gt;Documentation on php-fpm is not ideal, but you can see some at &lt;a
href="http://php.net/manual/en/install.fpm.php"
&gt;http://php.net/manual/en/install.fpm.php&lt;/a&gt;.  The &lt;a
href="http://php-fpm.org" &gt;php-fpm.org&lt;/a&gt; site has more,
including a &lt;a href="http://groups.google.com/group/highload-php-en"
&gt;forum&lt;/a&gt; and &lt;a href="http://php-fpm.org/wiki/Main_Page" &gt;wiki&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;Php-fpm is commonly used in conjunction with the nginx webserver.
For this, you will need to compile nginx yourself.  Because php-fpm is
installed and managed separately from the webserver, the php-fpm RPM
will still be usable.  Now that Apache 2.4 has been released with
claims of improved performance, it will be interesting to see if web
server popularity swings back towards Apache.&lt;/p&gt;

&lt;p&gt;Finally, remember that the PHP RPMs on oss.oracle.com are for
testing purposes only. They are not supported.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/nlY3egHpBq8" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/php_fpm_fastcgi_process_manager</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/php_5_4_0_rpms</guid>
    <title>PHP 5.4.0 RPMs for 64bit Oracle Linux 5.x are available</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/0vWEd0slwD8/php_5_4_0_rpms</link>
        <pubDate>Tue, 13 Mar 2012 22:06:43 +0000</pubDate>
    <category>php</category>
    <category>feature</category>
    <category>install</category>
    <category>linux</category>
    <category>new</category>
    <category>php</category>
    <category>release</category>
    <category>rpm</category>
            <description>&lt;p&gt;I've published some vanilla PHP 5.4.0 RPMs to make new feature
testing easier for Oracle Linux 5.x 64 bit users.  The standard set of
RPMs is at &lt;a href="http://oss.oracle.com/projects/php/"
&gt;oss.oracle.com/projects/php&lt;/a&gt;.  The OCI8 extension is also
available (this requires the free Oracle Instant Client 11.2 from &lt;a
href="http://linux.oracle.com/" &gt;ULN&lt;/a&gt; or &lt;a
href="http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html"
&gt;OTN&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;Some of the features of PHP 5.4 are:&lt;/p&gt;

&lt;ul&gt;

  
  &lt;li&gt;&lt;p&gt;Improved memory usage and performance. Some impressive
preliminary reports of the benefits include:
&lt;a href="http://news.php.net/php.internals/57760" &gt;http://news.php.net/php.internals/57760&lt;/a&gt; and
&lt;a href="http://news.php.net/php.internals/57747" &gt;http://news.php.net/php.internals/57747&lt;/a&gt;.
    &lt;/p&gt;&lt;/li&gt;

    &lt;li&gt;&lt;p&gt;File Upload progress support is natively implemented.&lt;/p&gt;&lt;/li&gt;

    &lt;li&gt;&lt;p&gt;Support for Traits now allows code reuse:&lt;/p&gt;

&lt;pre&gt;
    trait t1 {
	function m1() { echo "hi"; }
	function m2() { echo "bye"; }
    }

    class my_c1 {
	use t1;
	/*...*/
    }

    class my_c2 extends c2 {
	use t1;
	/*...*/
    }
&lt;/pre&gt;
&lt;/li&gt;

&lt;li&gt;&lt;p&gt;A built-in HTTP server for development is included:&lt;/p&gt;
&lt;pre&gt;  php -S 127.0.0.1:8888
&lt;/pre&gt;
  &lt;/li&gt;
  
  &lt;li&gt;&lt;p&gt;Improvements were made to the interactive PHP shell (when PHP is
compiled with readline).&lt;/p&gt;
    &lt;/li&gt;
    
    &lt;li&gt;&lt;p&gt;A shortened array syntax was introduced: &lt;code&gt;$a = [1,2,3];&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

    &lt;li&gt;&lt;p&gt;The default character set for several internal functions was changed to UTF-8.&lt;/p&gt;&lt;/li&gt;

    &lt;li&gt;&lt;p&gt;Support for multibyte languages is now configurable at run-time
instead of compile-time.&lt;/p&gt;
      &lt;/li&gt;
      
      &lt;li&gt;&lt;p&gt;The value echo tag "&lt;code&gt;&amp;lt;?=&lt;/code&gt;" is now always on.&lt;/p&gt;&lt;/li&gt;

      &lt;li&gt;&lt;p&gt;Binary number support was added.&lt;/p&gt;&lt;/li&gt;

      &lt;li&gt;&lt;p&gt;DTrace support was added.&lt;/p&gt;&lt;/li&gt;

      &lt;li&gt;&lt;p&gt;A new typehint indicates a function argument must be callable.&lt;/p&gt;&lt;/li&gt;

      &lt;li&gt;&lt;p&gt;Session entropy uses &lt;code&gt;/dev/urandom&lt;/code&gt; or
&lt;code&gt;/dev/arandom&lt;/code&gt; by default for extra security if either is
	present at compile time.&lt;/p&gt;&lt;/li&gt;

	&lt;li&gt;&lt;p&gt;Function call results can now be immediately dereferenced as arrays:
	  &lt;code&gt;foo()[0]&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

	  &lt;li&gt;&lt;p&gt;Class members can be accessed on instantiation: &lt;code&gt;(new foo)-&gt;method()&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;
  
&lt;p&gt;For more changes see the &lt;a href="http://php.net/migration54"
&gt;migration documentation&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/0vWEd0slwD8" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/php_5_4_0_rpms</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/php_5_4_is_out</guid>
    <title>PHP 5.4 is out; your work begins now</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/Gqib2TqqBDk/php_5_4_is_out</link>
        <pubDate>Fri, 2 Mar 2012 01:57:20 +0000</pubDate>
    <category>php</category>
            <description>&lt;p&gt;Exciting news: PHP 5.4 is out.  Thanks to the release managers Stas
&amp;amp; David for making it happen.  The PHP code is syncing to mirrors.
PHP documentation will take a day or two to build &amp;amp; sync.  Take a
look when it reaches you. &lt;/p&gt;

&lt;p&gt;The &lt;a href="http://php.net/releases/5_4_0.php" &gt;announcement&lt;/a&gt;
lists some of the features that have changed.&lt;/p&gt;

&lt;p&gt;There is a current tidy up of documentation for new features and
migration happening.  There are some low priority bug fixes that are
waiting merge.  These came in during the extended release process and
were left out to avoid destabilizing the code.&lt;/p&gt;

&lt;p&gt;Some PECL extensions still need to make PHP 5.4 compatible
releases.  Rasmus &lt;a
href="http://twitter.com/#!/rasmus/status/175355782961963008" &gt;helped
out&lt;/a&gt; by making changes to some extension, but the package owners
need to bundle up releases.  Other extensions may need some work.&lt;/p&gt;

&lt;p&gt;XDebug is due for a compatible release &lt;a
href="http://twitter.com/#!/xdebug/status/175354232176787456"
&gt;soon&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;PHPUnit is said to be &lt;a
href="http://twitter.com/#!/s_bergmann/status/175360254773694464"
&gt;fine&lt;/a&gt; already.&lt;/p&gt;

&lt;p&gt;APC has at least one &lt;a
href="http://svn.php.net/viewvc?view=revision&amp;amp;revision=323587"
&gt;pending fix&lt;/a&gt; too, for the "?:" operator.&lt;/p&gt;

&lt;p&gt;In summary, PHP 5.4 is available and I expect this branch will stabilize
quickly.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/Gqib2TqqBDk" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/php_5_4_is_out</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/php_virtualbox_vm_has_been</guid>
    <title>PHP VirtualBox VM has been refreshed</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/_QEHzvYrP3Q/php_virtualbox_vm_has_been</link>
        <pubDate>Thu, 19 Jan 2012 13:19:05 +0000</pubDate>
    <category>php</category>
    <category>database</category>
    <category>oracle</category>
    <category>php</category>
    <category>virtualbox</category>
    <category>vm</category>
    <category>xe</category>
            <description>&lt;p&gt;While I was recently on summer vacation (yes, it is summer in half
the world), the VirtualBox VM for PHP was refreshed to a more recent
Zend Server/Oracle Linux/Oracle Database XE stack.&lt;/p&gt;

&lt;p&gt;I just pulled the VM down, imported it and had it booting and
serving PHP pages in a very few minutes.  VirtualBox really is
marvelous.  There is a link to download the VM near the foot of the &lt;a
href="http://www.oracle.com/technetwork/community/developer-vm/index.html"
&gt;Oracle Technology Network Developer VM page&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/_QEHzvYrP3Q" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/php_virtualbox_vm_has_been</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/php_5_3_9_rpms</guid>
    <title>PHP 5.3.9 RPMs Available for Testing</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/mrMAx-4yGOQ/php_5_3_9_rpms</link>
        <pubDate>Thu, 12 Jan 2012 20:06:44 +0000</pubDate>
    <category>php</category>
    <category>install</category>
    <category>php</category>
    <category>release</category>
            <description>&lt;p&gt;I've updated my relatively "vanilla" PHP 5 RPMs to 5.3.9 on &lt;a
href="http://oss.oracle.com/projects/php/"&gt;oss.oracle.com/projects/php&lt;/a&gt;.
They are built for Oracle Linux 5.7 (and RHEL 5.7).  I've included the
OCI8 extension for Oracle DB, of course.  The various MySQL extension
are there and use the mysqlnd driver, so installation doesn't require
any client-side MySQL libraries.  Note the PHP 5.3.9 RPMs are for
testing only.  For production users I recommend &lt;a
href="http://www.oracle.com/technetwork/topics/php/zend-server-096314.html"
&gt;Zend Server&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/mrMAx-4yGOQ" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/php_5_3_9_rpms</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/php_oci8_1_4_7</guid>
    <title>PHP OCI8 1.4.7 is available on PECL</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/AWDc5GoINWU/php_oci8_1_4_7</link>
        <pubDate>Wed, 11 Jan 2012 13:37:37 +0000</pubDate>
    <category>php</category>
    <category>php</category>
    <category>release</category>
            <description>&lt;p&gt;Following on the heels of the &lt;a
href="http://www.php.net/archive/2012.php#id2012-01-11-1" &gt;PHP
5.3.9&lt;/a&gt; release, I've bundled &lt;a href="http://pecl.php.net/package/oci8/1.4.7"
&gt;OCI8 1.4.7 for PECL&lt;/a&gt;.  The PECL OCI8 1.4.7 code is the same as
included in PHP 5.3.9 and can be used to update older PHP installations.  The release notes are &lt;a
href="http://pecl.php.net/package-changelog.php?package=oci8&amp;release=1.4.7"
&gt;here&lt;/a&gt;. There are several bug fixes; upgrading is recommended.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/AWDc5GoINWU" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/php_oci8_1_4_7</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/php_oci_password_change_ora</guid>
    <title>PHP oci_password_change() ORA-1017 gotcha with Oracle Database 11.2.0.3</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/uWK5GmRZlPE/php_oci_password_change_ora</link>
        <pubDate>Mon, 24 Oct 2011 18:27:45 +0000</pubDate>
    <category>php</category>
    <category>client</category>
    <category>instant</category>
    <category>password</category>
    <category>php</category>
    <category>upgrade</category>
            <description>&lt;p&gt;The Oracle &lt;a
href="http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html"
&gt;Instant Client&lt;/a&gt; 11.2.0.3 for Linux is now available on OTN.  I
know many users will upgrade sooner rather than later to get the
"latest and greatest" release.&lt;/p&gt;

&lt;p&gt;However, if your PHP application uses &lt;tt&gt;&lt;a
href="http://www.php.net/manual/en/function.oci-password-change.php"
&gt;oci_password_change&lt;/a&gt;&lt;/tt&gt; (or its old alias
&lt;tt&gt;ocipasswordchange&lt;/tt&gt;), you should upgrade the client libraries
(Instant or normal "full" client) and the Oracle Database version to
11.2.0.3 at the same time.  Otherwise &lt;tt&gt;oci_password_change&lt;/tt&gt;
will fail with the error "ORA-1017: invalid username/password".  If
you're not using &lt;tt&gt;oci_password_change&lt;/tt&gt; then this won't impact
you.&lt;/p&gt;

&lt;p&gt;Since the protocol change is in the Oracle libraries, the change is
not just limited PHP. Any C program using Oracle's Call Interface
"OCIPasswordChange" API to change passwords will also have the same
restrictions.  &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/uWK5GmRZlPE" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/php_oci_password_change_ora</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/scripting_language_related_sessions_at</guid>
    <title>Scripting Language Related Sessions at Oracle OpenWorld and JavaOne, October 2011 </title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/ziyua5EiiaQ/scripting_language_related_sessions_at</link>
        <pubDate>Mon, 26 Sep 2011 23:50:29 +0000</pubDate>
    <category>php</category>
    <category>conference</category>
    <category>development</category>
    <category>javaone</category>
    <category>language</category>
    <category>oow</category>
    <category>openworld</category>
    <category>oracle</category>
    <category>perl</category>
    <category>php</category>
    <category>programming</category>
    <category>python</category>
    <category>rails</category>
    <category>ruby</category>
    <category>scripting</category>
    <category>sessions</category>
    <category>tuxedo</category>
            <description>&lt;p&gt;Oracle OpenWorld and JavaOne conferences are happening in San
Francisco next week. It will be a busy and exciting time.&lt;/p&gt;

&lt;p&gt;First, here's a shout out: For me the conference kicks off on Sunday morning.
Marcelle Kratochvil from Piction (heavy users of PHP and
Oracle DB) is hosting the inaugural &lt;strong&gt;Unstructured Data with Multimedia
SIG&lt;/strong&gt; for Oracle Database and MySQL database (&lt;a
href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=32440"
&gt;32440&lt;/a&gt;) Sunday 9:00 am in Moscone West room 2011.&lt;/p&gt;

&lt;p&gt;Below are some of the scripting and related
sessions happening during the week.
&lt;/p&gt;
&lt;h3&gt;Exhibition Hall&lt;/h3&gt;

&lt;p&gt;During the Exhibition Hall hours, come and talk to us at the
&lt;strong&gt;Database Access Services and APIs&lt;/strong&gt; booth.  This year
we're in Moscone South, Left SL-067.  The &lt;strong&gt;Tuxedo&lt;/strong&gt; application server
booth is Moscone South, Right - SR-202.  At JavaOne look out for the
&lt;strong&gt;NetBeans&lt;/strong&gt; booth, Hilton San Francisco - HHJ-023.  &lt;/p&gt;

&lt;h3&gt;Scripting Sessions, Birds-of-a-Feather Meetings, and Hands-on-Labs at OOW&lt;/h3&gt;

&lt;ul&gt;

  &lt;li&gt;The Oracle Tuxedo team has scripting language support in their powerful application server environment:&lt;br&gt;
&lt;strong&gt;High-Performance Web Applications with
C/C++/PHP/Python&lt;/strong&gt; (&lt;a
href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=15705"&gt;15705&lt;/a&gt;)
&lt;br&gt;&lt;i&gt;Monday, 05:00 PM, Moscone South - 300&lt;/i&gt; &lt;/li&gt;

&lt;li&gt; This year we are running introductory Hands-on Lab sessions
for three languages concurrently.  Come along and choose which
language you'd like to dip your toes into: &lt;br&gt;&lt;strong&gt;Develop and
Deploy High-Performance Web 2.0 PHP, Ruby, or Python
Applications&lt;/strong&gt; (&lt;a
href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=30082"
&gt;30082&lt;/a&gt;)
  &lt;br&gt;&lt;i&gt;Monday, 05:00 PM, Marriott Marquis - Salon 10/11&lt;/i&gt; &lt;/li&gt;

  &lt;li&gt;Come and ask questions at the round table Birds-of-a-Feather session:&lt;br&gt;
&lt;strong&gt;Meet the Oracle Database Clients Developers: C, C++, PHP,
Python, Ruby, and Perl&lt;/strong&gt; (&lt;a
href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=26240"&gt;26240&lt;/a&gt;)
    &lt;br&gt;&lt;i&gt;Monday, 07:30 PM, Marriott Marquis - Salon 8&lt;/i&gt; &lt;/li&gt;

&lt;li&gt; My overview and state-of-the-nation session is: &lt;br&gt;&lt;strong&gt;PHP, Ruby, Python, and Perl: Develop and Deploy
Mission-Critical Apps with Oracle Database 11g&lt;/strong&gt; (&lt;a
href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=14704"&gt;14704&lt;/a&gt;)
&lt;br&gt;&lt;i&gt;Wednesday, 11:45 AM, Marriott Marquis - Salon 8&lt;/i&gt; &lt;/li&gt;

&lt;li&gt;The Tuxedo team Hands-on-Lab lets you code in C/C++/PHP/Python/Ruby: &lt;br&gt;&lt;strong&gt;Develop High-Performance, Service-Oriented C/C++ Applications for Oracle Exalogic&lt;/strong&gt; (&lt;a href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=31120"&gt;31120&lt;/a&gt;)
&lt;br&gt;&lt;i&gt;Thursday, 12:00 PM, Marriott Marquis - Salon 3/4&lt;/i&gt;&lt;/li&gt;

&lt;li&gt;Raimonds Simanovskis, maintainer of the Rails adapter for Oracle
is giving a session: &lt;br&gt;&lt;strong&gt;Extending Oracle E-Business Suite with
Ruby on Rails&lt;/strong&gt; (&lt;a
href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=8604"&gt;8604&lt;/a&gt;)
&lt;br&gt;&lt;i&gt;Thursday, 03:00 PM, Moscone West - 2002/2004&lt;/i&gt; &lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Several other sessions discuss topics that scripting language devotees will find invaluable:&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;
  &lt;strong&gt;Build, Deploy, and Troubleshoot Highly Performant, Highly Available Apps with Oracle Database&lt;/strong&gt; (&lt;a href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=14703" &gt;14703&lt;/a&gt;)
  &lt;br&gt;&lt;i&gt;Wednesday, 05:00 PM, Moscone South - 303&lt;/i&gt;
&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Net Services: Best Practices for Performance, Scalability, and High Availability&lt;/strong&gt; (&lt;a href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=14345"&gt;14345&lt;/a&gt;)
&lt;br&gt;&lt;i&gt;Wednesday, 01:15 PM, Moscone South - 303&lt;/i&gt;
&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Also check out the full Oracle Tuxedo application server schedule &lt;a
href="https://blogs.oracle.com/Tuxedo/entry/oracle_tuxedo_at_oow_2011"
&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Scripting at JavaOne&lt;/h3&gt;
&lt;p&gt;Over in the concurrent JavaOne conference there are several scripting
sessions driven by San Francisco's &lt;a
href="http://www.engineyard.com/blog/2011/its-all-about-jruby/"&gt;EngineYard&lt;/a&gt;.  This year they have JRuby sessions

but with their &lt;a href="http://www.engineyard.com/orchestra" &gt;recent
aquisition&lt;/a&gt; of PHP technnology, I hope they'll have more on PHP
in one of the OOW streams next year:&lt;/p&gt;


&lt;ul&gt;

  &lt;li&gt;&lt;strong&gt;Accelerate Your Business and Aim for the Cloud with Java and
  JRuby&lt;/strong&gt; (&lt;a
  href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=25284"&gt;25284&lt;/a&gt;)&lt;br&gt;Wednesday, 03:00 PM, Parc 55 - Embarcadero&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;From Java to Rails: Techniques for Adding Ruby Agility to Your
  Java Web Stack&lt;/strong&gt; (&lt;a
  href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=24582"&gt;24582&lt;/a&gt;)&lt;br&gt;Monday, 05:30 PM, Parc 55 - Market Street&lt;/li&gt;
			
  &lt;li&gt;&lt;strong&gt;Real-World JRuby&lt;/strong&gt; (&lt;a
  href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=23600"&gt;23600&lt;/a&gt;)&lt;br&gt;Wednesday, 04:30 PM, Parc 55 - Market Street&lt;/li&gt;
			
  &lt;li&gt;&lt;strong&gt;Script Bowl 2011: A Scripting Languages Shootout&lt;/strong&gt; (&lt;a
  href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=22060"&gt;22060&lt;/a&gt;)&lt;br&gt;Wednesday, 08:30 AM, Hilton San Francisco - Grand Ballroom B&lt;/li&gt;

&lt;/ul&gt;


&lt;p&gt;

Also keep an eye out for the various NetBeans IDE sessions and demo booth.&lt;/p&gt;
&lt;h3&gt;Linux&lt;/h3&gt;

&lt;p&gt;Check out the four pages of &lt;a
href="http://www.oracle.com/openworld/oow11-focuson-linux-483706.pdf"
&gt;Focus on Linux&lt;/a&gt; sessions and events.&lt;/p&gt;

&lt;h3&gt;MySQL&lt;/h3&gt;
&lt;p&gt;There is a veritable plethora of MySQL content - four pages of
sessions and activites are listed in the &lt;a href="
http://www.oracle.com/openworld/oow11-focuson-mysql-486114.pdf"&gt;Oracle
Focus on MySQL&lt;/a&gt;.  Don't forget the &lt;strong&gt;MySQL Community Reception&lt;/strong&gt;
Tuesday 7:00pm - 9:00pm in the Marriott Marquis - Foothill G.&lt;/p&gt;

&lt;/p&gt;

&lt;p&gt;Having started this post with a shout out, let me end with one to
Bill Karwin, who was instrumental in getting PHP's Zend Framework off
the ground.  He is talking about &lt;a
href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=29101"&gt;MaatKit&lt;/a&gt;
and &lt;a
href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=29081"&gt;SQL
Injection&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Update: Ligaya Turmelle, well known in the PHP community, confirmed overnight that despite a recent job move she is still on track to present her  &lt;a
href="https://oracleus.wingateweb.com/scheduler/modifySession.do?SESSION_ID=16040"&gt;MySQL Performance Tuning&lt;/a&gt; talk (16040).&lt;/p&gt;


&lt;p&gt;You can search the OOW session catalog &lt;a
href="https://oracleus.wingateweb.com/scheduler/eventcatalog/eventCatalog.do"
&gt;here&lt;/a&gt; and the JavaOne session catalog &lt;a href="https://oracleus.wingateweb.com/scheduler/eventcatalog/eventCatalogJavaOne.do" &gt;here&lt;/a&gt;.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/ziyua5EiiaQ" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/scripting_language_related_sessions_at</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/oracle_11_2_xe_with</guid>
    <title>Oracle 11.2 XE with newly updated PHP Developer's Guide is available</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/4Q1HUK8DslU/oracle_11_2_xe_with</link>
        <pubDate>Sat, 3 Sep 2011 21:01:10 +0000</pubDate>
    <category>General</category>
    <category>database</category>
    <category>php</category>
    <category>release</category>
    <category>xe</category>
            <description>&lt;p&gt;Oracle Database 11g Release 2 Express Edition aka "Oracle XE" &lt;a
href="http://www.oracle.com/technetwork/database/express-edition/overview/index.html"&gt;is
now available&lt;/a&gt; on Linux 64 bit and Windows 32 bit.  This is a free
version of the Oracle Database. Windows 64 bit is "&lt;a
href="http://twitter.com/#!/krisrice/status/109780254956064768" &gt;in
the works&lt;/a&gt;" but Linux 32 bit is not planned.&lt;/p&gt;

&lt;p&gt;Check out the newly updated &lt;a
href="http://download.oracle.com/docs/cd/E17781_01/appdev.112/e18555/toc.htm"&gt;Oracle
Database Express Edition 2 Day + PHP Developer's Guide&lt;/a&gt;. As well as
HTML and PDF variants, the manual is available in &lt;a
href="http://download.oracle.com/docs/cd/E17781_01/appdev.112/E18555-03.mobi"
&gt;Mobi&lt;/a&gt; and &lt;a
href="http://download.oracle.com/docs/cd/E17781_01/appdev.112/E18555-03.epub"
&gt;EPUB&lt;/a&gt; formats.&lt;/p&gt;

&lt;p&gt;The 2 Day + PHP manual has steps for installing PHP and walks through creating an introductory
application.  It shows different ways to interact with Oracle XE and
introduces PHP 5.3 features.&lt;/p&gt;

&lt;p&gt;The example shows the mechanics of DB interaction.  It builds the application from the ground up so you can understand how to construct your own high performance applications.  If you want to
continue the learning path and use a PHP framework, Oracle 11g XE works with the &lt;a
href="http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/oow10/php_webapp/php_webapp.htm"
&gt;Developing a PHP Web Application with Oracle Database 11g&lt;/a&gt;
training.&lt;/p&gt;

&lt;p&gt;The Oracle 11.2 XE Linux install is RPM based. It takes just a few
minutes to install, prompting only for a few necessary details such as
desired passwords and ports.  You need root access to install it.&lt;/p&gt;

&lt;p&gt;Oracle 11.2 XE supports &lt;a
href="http://www.oracle.com/technetwork/topics/php/whatsnew/php-scalability-ha-twp-128842.pdf"
&gt;DRCP connection pooling&lt;/a&gt; so you'll really be able to maximize the
small footprint database for PHP applications.&lt;/p&gt;

&lt;p&gt;Readers who want to dive deeper into detail about PHP and advanced
features available in other editions of Oracle Database might be
interested in the later sections of the &lt;a
href="http://www.oracle.com/technetwork/topics/php/underground-php-oracle-manual-098250.html"&gt;Underground
PHP and Oracle Manual&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/4Q1HUK8DslU" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/oracle_11_2_xe_with</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/php_5_3_8_rpms</guid>
    <title>PHP 5.3.8 RPMs are on oss.oracle.com</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/URoo4QhA6QQ/php_5_3_8_rpms</link>
        <pubDate>Tue, 30 Aug 2011 15:41:09 +0000</pubDate>
    <category>General</category>
            <description>&lt;p&gt;I've built PHP 5.3.8 RPM packages with various common extensions
(and the latest OCI8 1.4.6) for Linux x64.  They are downloadable at
&lt;a
href="http://oss.oracle.com/projects/php/"&gt;oss.oracle.com/projects/php/&lt;/a&gt;.
These binaries might be useful for quick testing. They are
unsupported.&lt;/p&gt;

&lt;p&gt;Oracle customers with support using Oracle Linux 5.6+ may prefer
the stable PHP 5.3.3 php53-* packages available on &lt;a
href="https://linux.oracle.com" &gt;ULN&lt;/a&gt;. The OCI8 extension is also
available there.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/URoo4QhA6QQ" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/php_5_3_8_rpms</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/php_oci8_1_4_6</guid>
    <title>PHP OCI8 1.4.6 is Available</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/GXSrKrwI4hU/php_oci8_1_4_6</link>
        <pubDate>Mon, 22 Aug 2011 19:15:45 +0000</pubDate>
    <category>General</category>
            <description>I just released &lt;a href="http://pecl.php.net/package/oci8"&gt;PHP OCI8
1.4.6 on PECL&lt;/a&gt;.  This is the same OCI8 extension that is included
in PHP 5.3.7 and PHP 5.3.8.&lt;p&gt;

The release is mostly test suite additions.  A new &lt;a
href="http://php.net/manual/en/function.oci-client-version.php"&gt;oci_client_version()&lt;/a&gt;
function is available.  This is useful for OCI8's test suite to
overcome some of the limitations of PHP's simple test
infrastructure. You might also find it useful in special cases where
you need to know the exact version of the Oracle client libraries that
PHP is using.&lt;p&gt;

There are also some small internal code changes brought on by general
PHP code cleanups.  These OCI8 changes allow cross version portability
for the extension.&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/GXSrKrwI4hU" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/php_oci8_1_4_6</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/oracle_enhanced_adapter_1_4</guid>
    <title>Oracle Enhanced Adapter 1.4.0 for Ruby on Rails is Available</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/19CLiAKBfUs/oracle_enhanced_adapter_1_4</link>
        <pubDate>Wed, 10 Aug 2011 08:45:59 +0000</pubDate>
    <category>ruby</category>
            <description>Check out Raimond Simanovskis's updated Rails ActiveRecord adapter for
Ruby and JRuby with Oracle DB: &lt;a
href="http://blog.rayapps.com/2011/08/09/oracle-enhanced-adapter-1-4-0-and-readme-driven-development/"
&gt;Oracle enhanced adapter 1.4.0 and Readme Driven Development&lt;/a&gt;.  I love the "Readme Driven Development" approach.  It's close to my favorite model which is "install Driven Development".&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/19CLiAKBfUs" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/oracle_enhanced_adapter_1_4</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/oracle_resources_for_php</guid>
    <title>Oracle Resources for PHP</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/cTDdrbpPtaM/oracle_resources_for_php</link>
        <pubDate>Wed, 15 Jun 2011 11:58:56 +0000</pubDate>
    <category>php</category>
    <category>application</category>
    <category>bdb</category>
    <category>berkeley</category>
    <category>cache</category>
    <category>database</category>
    <category>db</category>
    <category>ide</category>
    <category>linux</category>
    <category>mysql</category>
    <category>netbeans</category>
    <category>oracle</category>
    <category>otn</category>
    <category>php</category>
    <category>server</category>
    <category>timesten</category>
    <category>tuxedo</category>
    <category>virtualization</category>
            <description>&lt;p&gt;Here are some key resources for working with &lt;a class="highlight"
href="http://php.net/"&gt;PHP&lt;/a&gt; and Oracle technologies.&lt;/p&gt;

&lt;ul&gt;
&lt;p&gt;&lt;li&gt;&lt;b&gt;Overall Links&lt;/b&gt;&lt;/p&gt;


&lt;p&gt;&lt;b&gt;Oracle :&lt;/b&gt;  &lt;a class="highlight" href="http://www.oracle.com/technetwork/index.html" &gt;Oracle Technology Network (OTN)&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;&lt;b&gt;Homepage : &lt;/b&gt; &lt;a class="highlight" href="http://otn.oracle.com/php"&gt;The PHP Developer Center&lt;/a&gt;  -- downloads, how-tos, sample code and discussion forums brought to you by OTN.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Read : &lt;/b&gt; &lt;a class="highlight" href="http://www.oracle.com/technetwork/articles/dsl/index.html" &gt;PHP Articles&lt;/a&gt;  -- a collection of informative articles on OTN.&lt;/p&gt;
	    
&lt;p&gt;&lt;b&gt;Technology : &lt;/b&gt;&lt;a class="highlight" href="http://www.oracle.com/technology/software/index.html"&gt;Download&lt;/a&gt;  the newest versions of other software in Oracle's Technology Stack. &lt;a href="http://www.oracle.com/technetwork/topics/dotnet/whatsnew/application-development-11g-whitepa-132847.pdf" &gt;Read&lt;/a&gt;  about other Oracle application development tools.&lt;/p&gt;


&lt;li&gt;
&lt;a name="php"&gt;&lt;/a&gt;

&lt;p&gt;&lt;b&gt;PHP Oracle Database Extension : &lt;/b&gt;&lt;a class="highlight" href="http://pecl.php.net/package/oci8"&gt;OCI8&lt;/a&gt;  is the most available
and scalable PHP adapter for the Oracle database. It is included with PHP, and is also separately downloadable for upgrading older PHP
releases. OCI8 works with PHP 4 and PHP 5, and will compile with Oracle 9&lt;i&gt;i&lt;/i&gt;R2, 10&lt;i&gt;g&lt;/i&gt; and 11&lt;i&gt;g&lt;/i&gt; client libraries. Oracle's standard
cross-version compatibility and connectivity is applicable, so OCI8 can connect to older or newer databases, locally or
remotely.  The latest OCI8 release includes support for Oracle Database 11&lt;i&gt;g&lt;/i&gt; Database Resident Connection Pooling (DRCP), and for Fast
Application Notification (FAN) [&lt;a class="highlight" href="http://www.oracle.com/technetwork/topics/php/php-scalability-ha-twp-128842.pdf"&gt;whitepaper
here&lt;/a&gt;], and also has support for Oracle's authentication and end-to-end tracing meta data attributes [&lt;a class="highlight"
href="http://www.oracle.com/technetwork/articles/dsl/php-web-auditing-171451.html"&gt;article here&lt;/a&gt;].  These
features improve scalability and availabilty of the OCI8 extension.&lt;/p&gt;

&lt;p&gt;The OCI8 extension can also be used with the &lt;a class="highlight" href="http://www.oracle.com/technetwork/database/options/imdb-cache/index.html" &gt;Oracle In-Memory Database Cache&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;Book : &lt;a class="highlight"
href="http://www.oracle.com/technetwork/topics/php/underground-php-oracle-manual-098250.html"&gt;The Underground PHP &amp;amp; Oracle
Manual&lt;/a&gt; -- the definitive, free guide to using PHP with Oracle Database.&lt;/p&gt;

&lt;p&gt;Tutorial : &lt;a class="highlight"
href="https://apex.oracle.com/pls/apex/f?p=44785:24:7125334043146::NO:24:P24_CONTENT_ID,P24_PREV_PAGE:5125,29"&gt;Oracle &amp;amp; PHP tutorials&lt;/a&gt;  -- step by
step &lt;a class="highlight" href="http://www.oracle.com/technetwork/tutorials/index.html" &gt;Oracle Learning Library&lt;/a&gt;  tutorials for using PHP with Oracle. (Free OTN &lt;a class="highlight" href="https://myprofile.oracle.com/EndUser/faces/profile/createUser.jspx"&gt;login&lt;/a&gt;  required) &lt;/p&gt;


&lt;p&gt;Read : &lt;a class="highlight" href="http://www.oracle.com/technetwork/topics/php/php-scalability-ha-twp-128842.pdf"&gt;PHP &amp;amp; High Scalability&lt;/a&gt;  --
covers enabling DRCP and FAN for PHP applications.&lt;/p&gt;

&lt;p&gt;Read : &lt;a class="highlight" href="http://www.oracle.com/technetwork/articles/dsl/php-web-auditing-171451.html" &gt;PHP Web Auditing, Authorization and
Monitoring with Oracle Database&lt;/a&gt;  -- learn how to audit individual web users, automatically apply rules to
individual web users to restrict data access, and monitor and trace database usage per application user.&lt;/p&gt;

&lt;p&gt;Forum : &lt;a class="highlight" href="http://forums.oracle.com/forums/forum.jspa?forumID=178"&gt;The Oracle
&amp;amp; PHP forum&lt;/a&gt;  -- technical discussion forum for using PHP with Oracle.&lt;/p&gt;

&lt;p&gt;Blog : &lt;a class="highlight" href="https://blogs.oracle.com/opal/"&gt;PHP and Oracle: Christopher Jones&lt;/a&gt;  -- The latest news on PHP and Oracle.&lt;/p&gt;


&lt;li&gt;
&lt;a name="xe"&gt;&lt;/a&gt;

&lt;p&gt; &lt;b&gt;Database : &lt;/b&gt;&lt;a class="highlight" href="http://www.oracle.com/technetwork/database/express-edition/overview/index.html"&gt;Oracle Express Edition Database&lt;/a&gt;
 -- an entry-level, small-footprint database based on the standard Oracle
Database code base that's &lt;b&gt;free to develop, deploy, and distribute; fast to download; and simple to administer.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;PHP OCI8 works with Oracle Database XE the same way it works with the other editions of Oracle Database.&lt;/p&gt;

&lt;p&gt;Oracle Database XE is a great starter database for:&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt; &lt;strong&gt;Developers&lt;/strong&gt; working on PHP, Python, Ruby, Java, .Net and other open source applications.  &lt;/li&gt;

&lt;li&gt; &lt;strong&gt;DBAs&lt;/strong&gt; who need a free, starter database for training and deployment &lt;/li&gt;

&lt;li&gt; &lt;strong&gt;Independent Software Vendors (ISVs) and hardware vendors&lt;/strong&gt; who want a starter database to distribute free of
charge &lt;/li&gt;

&lt;li&gt; &lt;strong&gt;Educational institutions and students&lt;/strong&gt; who need a free database for their curriculum &lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt; &lt;a class="highlight" href="http://www.oracle.com/technetwork/database/express-edition/downloads/index.html"&gt;Install Now!&lt;/a&gt; &lt;/p&gt;


&lt;li&gt;
&lt;a name="mysql"&gt;&lt;/a&gt;

&lt;p&gt;&lt;b&gt;Database : &lt;/b&gt;&lt;a class="highlight" href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt;  -- The world's most popular open source
database. MySQL Community Edition is the freely downloadable version. Commercial customers have the flexibility of choosing from multiple editions to
meet specific business and technical requirements. Also available for free is the MySQL Workbench for SQL Authoring, System Administration, and schema
modeling.&lt;/p&gt;

&lt;p&gt;Recent additions to MySQL include semi synchronous replication, direct memcached-to-InnoDB access, multi-threaded replication, and enhanced
partitioning.  See &lt;a class="highlight" href="http://dev.mysql.com/tech-resources/articles/whats-new-in-mysql-5.6.html" &gt;What's new in MySQL 5.6&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;PHP's mysqli or PDO_mysql extensions can be used to access MySQL.&lt;/p&gt;

&lt;p&gt;Check out the new &lt;a class="highlight" href="http://pecl.php.net/mysqlnd_qc"
&gt;Query Cache plugin&lt;/a&gt; documented &lt;a class="highlight" href="http://php.net/mysqlnd_qc"
&gt;here&lt;/a&gt; and the &lt;a class="highlight" href="http://pecl.php.net/mysqlnd_ms"
&gt;Replication and Load-Balancing plugin&lt;/a&gt; for master-slave-splitting, documented
[&lt;a class="highlight" href="http://php.net/mysqlnd_ms" &gt;here&lt;/a&gt;].&lt;/p&gt;

&lt;p&gt;Homepage : &lt;a class="highlight" href="http://dev.mysql.com/usingmysql/php/" &gt;Using MySQL With PHP&lt;/a&gt;  -- Articles and downloads&lt;/p&gt;

&lt;p&gt;Forum : &lt;a class="highlight" href="http://forums.mysql.com/list.php?52" &gt;PHP and MySQL forum&lt;/a&gt;  -- The place to ask questions&lt;/p&gt;

&lt;p&gt;Blog : &lt;a class="highlight" href="http://planet.mysql.com/" &gt;Planet MySQL&lt;/a&gt;  -- The latest MySQL news from the community&lt;/p&gt;

&lt;p&gt;Blog : &lt;a class="highlight" href="http://schlueters.de/blog/" &gt;Johannes Schlüter&lt;/a&gt;  -- A member of the MySQL connector team and the current PHP Release Master.&lt;/p&gt;

&lt;p&gt;Blog : &lt;a class="highlight" href="http://www.khankennels.com/blog/" &gt;Me Talking Out Loud&lt;/a&gt;  -- Ligaya Turmelle, a
member of MySQL Support. (and contributer to &lt;a class="highlight" href="http://www.amazon.com/PHP-Anthology-Essential-Tricks-Hacks/dp/0975841998"&gt;The
PHP Anthology: 101 Essential Tips, Tricks &amp; Hacks&lt;/a&gt;) &lt;/p&gt;

&lt;p&gt;Blog : &lt;a class="highlight" href="http://blog.ulf-wendel.de/?p=308" &gt;Internet Super Hero&lt;/a&gt;  -- Ulf Wendel, a member of the MySQL connector team.&lt;/p&gt;

&lt;p&gt;Books : Many!  Including &lt;a class="highlight" href="http://www.amazon.com/PHP-MySQL-Web-Development-4th/dp/0672329166/" &gt;PHP and MySQL Web Development&lt;/a&gt; and &lt;a class="highlight" href="http://www.amazon.com/Web-Database-Applications-PHP-MySQL/dp/0596000413" &gt;Web Database
Applications with PHP &amp; MySQL&lt;/a&gt;  and &lt;a class="highlight"
href="http://www.amazon.com/Learning-MySQL-Step-Step-Database-Driven/dp/0596514018/ref=pd_sim_b_2" &gt;Learning PHP &amp; MySQL: Step-by-Step Guide to
Creating Database-Driven Web Sites&lt;/a&gt; &lt;/p&gt;

&lt;p&gt; &lt;a class="highlight" href="http://www.mysql.com/downloads/"&gt;Install Now!&lt;/a&gt; &lt;/p&gt;


&lt;li&gt;
&lt;a name="bdb"&gt;&lt;/a&gt;

&lt;p&gt;&lt;b&gt;Database : &lt;/b&gt;&lt;a class="highlight" href="http://www.oracle.com/technetwork/database/berkeleydb/overview/index.html"&gt;Oracle
Berkeley DB 11&lt;i&gt;g&lt;/i&gt;&lt;/a&gt;  -- provides the complex data management features found in
enterprise class databases. These facilities include high throughput, low-latency reads, non-blocking writes, high concurrency, data
scalability, in-memory caching, ACID transactions, automatic and catastrophic recovery when the application, system or hardware fails,
high availability and replication in an application configurable package. Simply configure the library and use the particular features
available to satisfy your particular application needs. Berkeley DB can be configured to address any application need from the hand-held
device to the datacenter, from a local storage solution to a world-wide distributed one, from kilobytes to petabytes. &lt;/p&gt;

&lt;p&gt;Berkeley DB's &lt;a
href="http://www.oracle.com/technetwork/database/berkeleydb/overview/sql-160887.html"
&gt;SQL API&lt;/a&gt; allows PHP's sqlite3 and PDO_sqlite extensions to be
used.&lt;/p&gt;
  
&lt;p&gt;Berkeley DB also includes source code for a php_db4 extension.&lt;/p&gt;

&lt;p&gt; &lt;a class="highlight" href="http://www.oracle.com/technetwork/database/berkeleydb/downloads/index.html"&gt;Install Now!&lt;/a&gt; &lt;/p&gt; 


&lt;li&gt;
&lt;a name="netbeans"&gt;&lt;/a&gt;

&lt;p&gt;&lt;b&gt;IDE : &lt;/b&gt;&lt;a class="highlight" href="http://netbeans.org/"&gt;NetBeans&lt;/a&gt;  --  lets you develop desktop, mobile and web
applications using Java, PHP, C/C++ and more.  Runs on Windows, Linux, Mac OS X and Solaris. NetBeans IDE is open-source and free.&lt;/p&gt;

&lt;p&gt;Understand: &lt;a class="highlight" href="http://netbeans.org/features/php/" &gt;NetBeans PHP features&lt;/a&gt;  -- All the great features that NetBeans has for PHP developers&lt;/p&gt;

&lt;p&gt;Learn: &lt;a class="highlight" href="http://netbeans.org/kb/trails/php.html" &gt;NetBeans PHP Learning Trail&lt;/a&gt;  -- the best way to learn how to use NetBeans&lt;/p&gt;

&lt;p&gt; &lt;a class="highlight" href="http://netbeans.org/downloads/"&gt;Install Now!&lt;/a&gt; &lt;/p&gt;


&lt;li&gt;
&lt;a name="vbox"&gt;&lt;/a&gt;

&lt;p&gt;&lt;b&gt;Virtualize : &lt;/b&gt;&lt;a class="highlight" href="http://www.oracle.com/technetwork/server-storage/virtualbox/overview/index.html"&gt;Oracle VM
VirtualBox&lt;/a&gt;  -- powerful Cross-platform Virtualization Software for x86-based systems.  "Cross-platform"
means that it installs on Windows, Linux, Mac OS X and Solaris x86 computers. And "Virtualization Software" means that you can create
and run multiple Virtual Machines, running different operating systems, on the same computer at the same time. For example, you can
run Windows and Linux on your Mac, run Linux and Solaris on your Windows PC, or run Windows on your Linux systems.  &lt;/p&gt;


&lt;p&gt; Oracle VM VirtualBox is available as Open Source or pre-built Binaries for Windows, Linux, Mac OS X and
Solaris.  &lt;/p&gt;

&lt;p&gt;OTN hosts some &lt;a class="highlight" href="http://www.oracle.com/technetwork/community/developer-vm/index.html" &gt;pre-built Developer VMs&lt;/a&gt; , including an Oracle Tuxedo Web Application Server VM showing PHP support.  There is also a Zend Server VM for PHP created by Zend.  &lt;a class="highlight"
href="http://www.oracle.com/technetwork/topics/php/zend-server-096314.html"&gt;Zend Server&lt;/a&gt;  is a complete,
Oracle-enabled, enterprise-ready Web Application Server for running and managing PHP applications that require a high level of reliability,
performance and security.  Zend Server is available in community and supported editions.&lt;/p&gt;

&lt;p&gt; &lt;a class="highlight" href="http://www.virtualbox.org/wiki/Downloads"&gt; Install Now!&lt;/a&gt; &lt;/p&gt;


&lt;li&gt;
&lt;a name="linux"&gt;&lt;/a&gt;

&lt;p&gt;&lt;b&gt;Operating system : &lt;/b&gt;&lt;a class="highlight" href="http://www.oracle.com/us/technologies/linux/index.html"&gt;Oracle Linux&lt;/a&gt;  -- free to download and distribute.  As one of the most widely deployed operating systems today, Linux is increasingly being
adopted for cloud-based solutions. Oracle Linux is the most complete and integrated solution available and delivers higher performance and better
reliability at up to 7 times lower cost than Red Hat. &lt;a class="highlight" href="http://www.oracle.com/us/technologies/linux/competitive-335546.html" &gt;Why Choose Oracle
Linux over Red Hat Linux?&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Oracle Linux 5.6 and 6 introduced PHP 5.3 packages.  Subscribers to the Unbreakable Linux Network have access to an additional
pre-built PHP OCI8 RPM, and also direct access to an RPM for installing  &lt;a class="highlight"
href="http://www.oracle.com/technetwork/topics/php/zend-server-096314.html"&gt;Zend Server&lt;/a&gt; .&lt;/p&gt;

&lt;p&gt;Users of older Linux 5 releases can get PHP 5.3 RPMs from &lt;a class="highlight" href="http://oss.oracle.com/projects/php/"&gt;oss.oracle.com&lt;/a&gt; .&lt;/p&gt;

&lt;p&gt; &lt;a class="highlight" href="https://linux.oracle.com"&gt;Install Now!&lt;/a&gt; &lt;/p&gt;


&lt;li&gt;
&lt;a name="tuxedo"&gt;&lt;/a&gt;

&lt;p&gt;&lt;b&gt;Application Server : &lt;/b&gt;&lt;a class="highlight" href="http://www.oracle.com/technetwork/middleware/tuxedo/overview/index.html"&gt;Oracle Tuxedo&lt;/a&gt;
 -- provides a robust, grid enabled platform for developing enterprise applications.  It provides mainframe-class scale
and performance on open, distributed systems for software written in C, C++, COBOL, PHP, Python and Ruby.  Oracle Tuxedo provides cost-effective
reliability, extreme scalability and throughput of hundreds of thousands of transactions per second.  Functionality like Web services, SCA programming
model, metadata driven application development make it simple to develop and integrate applications written in many programming languages.  &lt;/p&gt;

&lt;p&gt;PHP applications can be hosted on the Tuxedo platform without requiring any code changes and can leverage high availability, scalability and
integration capabilities.&lt;/p&gt;

&lt;p&gt;The whitepaper &lt;a href="http://www.oracle.com/technetwork/middleware/tuxedo/tuxedo-dynamic-langs-twp-401471.pdf"&gt;Oracle Tuxedo - An Enterprise
Platform for Dynamic Languages&lt;/a&gt; explains the architecture and features.  A &lt;a
href="http://www.oracle.com/technetwork/middleware/tuxedo/downloads/index.html"&gt;Tuxedo Demo VM&lt;/a&gt; for VirtualBox is available for immediate
testing.&lt;/p&gt;

&lt;p&gt; &lt;a class="highlight" href="http://www.oracle.com/technetwork/middleware/tuxedo/downloads/index.html"&gt;Install Now!&lt;/a&gt; &lt;/p&gt;

&lt;li&gt;
&lt;a name="ic"&gt;&lt;/a&gt;

&lt;p&gt;&lt;b&gt;Client Libraries : &lt;/b&gt;&lt;a class="highlight" href="http://www.oracle.com/technetwork/database/features/instant-client/index-100365.html"&gt;Oracle Instant
Client&lt;/a&gt;  -- a small footprint set of libraries that allows applications and tools to connect to an existing Oracle
Database.  Oracle OCI, OCCI, Pro*C, ODBC, and JDBC applications work without modification.&lt;/p&gt;

&lt;p&gt;The PHP OCI8 extension can be built with Oracle Instant Client to connect to a remote database.&lt;/p&gt;

&lt;p&gt;Instant Client is provided under a separate OTN Development and Distribution License for Instant Client that
allows most licensees to download, redistribute, and deploy in production environments, without charge. &lt;/p&gt;

&lt;p&gt; &lt;a class="highlight" href="http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html"&gt;Install Now!&lt;/a&gt; &lt;/p&gt;


&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/cTDdrbpPtaM" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/oracle_resources_for_php</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/mid_conference_wrap_up</guid>
    <title>Mid conference wrap up</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/2d14SqJ4SwI/mid_conference_wrap_up</link>
        <pubDate>Tue, 24 May 2011 12:51:10 +0000</pubDate>
    <category>php</category>
    <category>conference</category>
    <category>dpc11</category>
    <category>php</category>
    <category>tek11</category>
            <description>&lt;p&gt;In a nicer section of the RAI conference center than in previous
years I've attended, the Dutch PHP conference last week was as professionally
organized as ever by &lt;a href="http://www.ibuildings.nl/"&gt;ibuildings&lt;/a&gt;.  The weather was kind too, having cleared up from a
previous blustery days I'd spent south of Amsterdam with my
parents.&lt;/p&gt;

&lt;p&gt;My talk had a big audience, which stayed the course.  Unfortunately
my abstract was condensed down in the small printed
name-tag/program-guide, which contributed to some polarized reviews.
Some really liked the Oracle-PHP overview section, while others were
not expecting it.&lt;/p&gt;

&lt;p&gt;In a few minutes I'm heading off to Chicago for &lt;a
href="http://tek11.phparch.com/" &gt;php|tek&lt;/a&gt;.  My &lt;a
href="http://tek11.phparch.com/talk-synopses/#Developing-and-Deploying-High-Performance-PHP-Applications"
&gt;talk&lt;/a&gt; is based on the presentation I gave at DPC but I'll cut down
the "state of the Oracle-PHP nation" section down by a couple of
slides (taking it to about 8 minutes worth).  I'll also rejig which
advanced Oracle techniques are covered in the main part of the talk.
My code snippets and screen captures didn't satisfy DPC audience's
thirst for knowledge so I'm adding back (some) live demos - hey, why
not live dangerously!?&lt;/p&gt;

&lt;p&gt;Since I'm at the conference for the full three session days,
there'll be plenty of time for you to pin me down with your questions.
And if you have MySQL questions, Ligaya Turmelle is the person to talk
to.  Her tutorial is in session as I write.  She's also talking about
schema normalization on Wednesday afternoon.&lt;/p&gt;

&lt;p&gt;At php|tek make sure you come along to the Uncon after hours on
Wednesday and find all the latest and hot topics.  Oracle is
sponsoring it this year.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/2d14SqJ4SwI" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/mid_conference_wrap_up</feedburner:origLink></item>
    <item>
    <guid isPermaLink="false">https://blogs.oracle.com/opal/entry/oracle_at_dutch_php_conference</guid>
    <title>Oracle at the Dutch PHP Conference &amp; php|tek</title>
    <dc:creator>cj</dc:creator>
    <link>http://feedproxy.google.com/~r/ChristopherJonesOnOpal/~3/TqObBVVQH9c/oracle_at_dutch_php_conference</link>
        <pubDate>Sat, 14 May 2011 11:15:08 +0000</pubDate>
    <category>php</category>
    <category>conference</category>
    <category>oracle</category>
    <category>php</category>
            <description>&lt;p&gt;I'm off to Amsterdam to talk at the &lt;a href="http://www.phpconference.nl/"&gt;Dutch PHP Conference&lt;/a&gt;.  After that it's on to Chicago for &lt;a href="http://tek11.phparch.com/"&gt;php|tek&lt;/a&gt;. &lt;/p&gt; 

&lt;p&gt;See you there!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ChristopherJonesOnOpal/~4/TqObBVVQH9c" height="1" width="1"/&gt;</description>          <feedburner:origLink>https://blogs.oracle.com/opal/entry/oracle_at_dutch_php_conference</feedburner:origLink></item>
  </channel>
</rss>
