Saturday, August 16, 2014

Phalcon (PHP Framework) Installation

Phalcon Core Installation (For Windows Developer)

  1. http://phalconphp.com/en/download/windows
    Download "Phalcon x.x.x - Windows x86 for PHP 5.4.0 (VC9)"
  2. Find out php.ini, add this line to the file :
    extension=php_phalcon.dll
  3. Restart Apache http server

Phalcon Developer Tool Installation

  1. https://github.com/phalcon/phalcon-devtools
    Download the Developer Tool as a  ZIP file
  2. Extract the ZIP files to C:\phalcon-tools\
  3. Edit phalcon.bat
    a. set PTOOLSPATH=C:\phalcon-tools
    b. php %PTOOLSPATH%\phalcon.php %*
  4. Adding PHP  to your system PATH
    e.g. ;C:\[xampp_root]\php
  5. Adding Tools to your system PATH
    e.g. ;C:\phalcon-tools
  6. Test the PHP system Path setting
    Open command prompt i.e. "Windows Key" + "r" , then input CMD
    Input: "php -v" in the black screen
    Output :
    PHP 5.x.x (cli) (built: Sep 12 2012 23:48:31)
    Copyright (c) 1997-2012 The PHP Group
    Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
  7. Test the Phalcon system Path setting
    Open command prompt i.e. "Windows Key" + "r" , then input CMD
    Input: "phalcon" in the black screen
    Output :
    Phalcon DevTools (1.3.2 ALPHA 1)
    Available commands:
      commands (alias of: list, enumerate)
      controller (alias of: create-controller)
      model (alias of: create-model)
      all-models (alias of: create-all-models)
      project (alias of: create-project)
      scaffold
      migration
      webtools




Thursday, November 21, 2013

Tomcat 6 https / SSL Installation with Self-signed Certificate

Generate Keystore File

  1. RUN
    "C:\Program Files\Java\jdk1.6.0_45\bin\keytool" -genkey -alias tomcat -keyalg RSA -keystore c:\tomcatkeystore
    OR RUN
    "C:\Program Files\Java\jre7\bin\keytool" -genkey -alias tomcat -keyalg RSA -keystore c:\tomcatkeystore
  2. Input keystore password: changeit
  3. Input password again: changeit
  4. Input name: Andy Jackson
  5. Input organizational unit: HR Department
  6. Input organization name: Soho Bussiness Ltd
  7. Input city: Guangzhou
  8. Input province: Guangdong
  9. Input country code: CN
  10. Confirm submission: Y
  11. Tomcat password: changeit
  12. Tomcat password again: changeit
  13. The keystore file will be located at c:\tomcatkeystore

Config tomcat (C:\Program Files\Apache Software Foundation\Tomcat 6.0\conf\server.xml)

Input the following code to server.xml

<Connector protocol="org.apache.coyote.http11.Http11Protocol"
            port="443" minSpareThreads="5" maxSpareThreads="75"
            enableLookups="true" disableUploadTimout="true"
            acceptCount="100"  maxThreads="200"
            scheme="https" secure="true" SSLEnabled="true"
            clientAuth="false" sslProtocol="TLS"
            keystoreFile="c:\tomcatkeystore"
            keystoreType="JKS" keystorePass="changeit"    />

Testing

Go to https://localhost with your default browser

Wednesday, October 23, 2013

Steps for Connecting MS SQL 2008 and 2008 R2 Server by PHP 5.3.x Connect MS SQL 2008 R2 with PDO

Step 1. in php.ini add the following line:
extension=php_pdo_sqlsrv_53_ts_vc6.dll

Step 2. un-comment this line:
;extension=php_pdo_mssql.dll

Step 3. download php_pdo_sqlsrv_53_ts_vc6.dll from here and place it in /php/ext

Step 4. restart apache http server


Verifying the setting is correct:

$dsn       = 'mysql:host=localhost;dbname=myDB';
$login     = 'myLogin';
$passwd = 'myPassword';

$db = new PDO($dsn, $login, $passwd);
$sqlToRun = "
   SELECT
   name AS [employeeName]
   FROM
   employee
";
$res = $db->prepare($sqlToRun); 
$res->execute(); 
$res->setFetchMode(PDO::FETCH_LAZY); 
while($row = $res->fetch(PDO::FETCH_ASSOC)) {
echo $row['employeeName'];
}


Tuesday, September 24, 2013

Kohana 3 Validation Rules / Kohana 3 Validation Option

Rule Parameter Description Example
not_empty No Returns FALSE if form field is empty  
min_length Yes Returns FALSE if the field is too short length[5] - minimum 5 characters long
max_length Yes Returns FALSE if the field is too long length[30] - maximum 30 characters long
exact_length Yes Returns FALSE if the field is too short or too long length[25] - 25 characters only
matches Yes Returns FALSE if field does not match field(s) in parameter matches[password_again]
date No Returns FALSE if form field is not a valid date  
regex Yes Returns FALSE if form field does not fulfill the regular expression regex[expression] - regular expression to match (including delimiters)
email Optional Returns FALSE if email is not valid mail[TRUE] - rfc822 strict
email_domain No Returns FALSE if domain of an email does not have valid MX record  
url No Returns FALSE if url is not valid  
ip Optional Returns FALSE if ip is not valid ip[TRUE] - allow private IP networks
credit_card Yes Returns FALSE if credit card is not valid credit_card[mastercard] - card type, or an array of card types
phone Optional Returns FALSE if phone number is not a valid length phone[7,10,11,14] - either 7, 10, 11 or 14 digits long (default is 7, 10 and 11)
alpha Optional Returns FALSE if form field does not consist only of alphabetical characters only alpha[TRUE] - trigger UTF-8 compatibility
alpha_numeric Optional Returns FALSE if form field does not consist only of alphabetical or numeric characters alpha_numeric[TRUE] - trigger UTF-8 compatibility
alpha_dash Optional Returns FALSE if form field does not consist only of alphabetical, numeric, underscore and dash characters alpha_dash[TRUE] - trigger UTF-8 compatibility
digit Optional Returns FALSE if form field does not consist only of digit characters (no dots or dashes). digit[TRUE] - trigger UTF-8 compatibility
numeric No Returns FALSE if form field is not a valid number (positive, negative or decimal)  
decimal Optional Returns FALSE if form field is not in proper decimal format decimal - is any valid decimal format
Optional parameter is for a specific decimal format decimal[4,2] - is 4 digits and 2 decimal places
range Yes Returns FALSE if form field is not withing the range min and max range[1,10] - between 1 and 10 include
color No Returns FALSE if form field is not proper hexadecimal HTML color value  

Thursday, August 29, 2013

AJAX Implementation in Kohana 3.3

AJAX Implementation in Kohana 3.3

application\classes\Controller\Ajax.php

Class Controller_AjaxDemo extends Controller_SiteWise_Protected
{
   public function action_callme()
    {
        if ($this->request->is_ajax())
        {
     // do something
            echo json_encode(array('test' => 1,'test2' =>2));
        }
        else
        {
     // do something
            echo "HI";
        }
 $this->auto_render = FALSE;
    }
}

In you template file e.g. ajax.tpl


<div id="div1"><h2>Will be replaced by Ajax call</h2></div>
<script> $.ajax({ url:"AjaxDemo/callme", success:function(result){ $("#div1").html(result) } }); </script>





Tuesday, August 27, 2013

crxml and kohana 3.3 integration

crxml and kohana 3.3 integration


  1. crxml.php can be downloaded here : https://github.com/sandeepcr529/crxml 
  2. put crxml.php to the following directory
    [your project]/application/vendor/crxml/
  3. Add the following code to
    [your project]/application/bootstrap.php

    if ($path = Kohana::find_file('vendor', 'crxml/crxml'))
    {
        ini_set('include_path',
        ini_get('include_path').PATH_SEPARATOR.dirname(dirname($path)));
     
        require_once 'crxml/crxml.php';
    }
    
  4. In any controller, test the installation by the following codes
    //Create a blank crXml object.
    $crxml = new crxml;
    
    //$xml_result contains the xml String
    $crxml->loadXML($xml_result); // 
     
    //Outputs the XML document e.g.
    echo $crxml->{'node1'}->{'node2'}->{'node3'}->{'node4'};
    
    

Monday, August 12, 2013

CRON JOB for Executing Remote PHP File


In Linux server

root account login

# crontab -e

type : curl --silent http://www.example.com/schedulerTest/add.php

save - :w

quit - :q

# crontab -l

If cron service has not start, use the following command:

/sbin/service crond start

Wednesday, August 7, 2013

Kohana 3.3 Smarty 3 Fix Template Not Found TPL Not Found

Change Case according to the following instruction.
\htdocs\kohanaLinux\modules\smarty3\classes\
└─Kohana
│ └─Smarty
│   └─Helper.php
└─Smarty
│ └─Helper.php
│ └─View.php
View.php

Monday, January 14, 2013

How-tos - How to create a PHP scheduler by Open-sourced SOS Job Scheduler.



How-tos - How to create a PHP scheduler by Open-sourced SOS Job Scheduler.

1. Download scheduler_linux.x.x.xx.xxxx.tar.gz to /tmp/

 http://www.sos-berlin.com/modules/cjaycontent/index.php?id=126&page=osource_scheduler_download_en.php

2. Untar the downloaded tar file to /tmp/scheduler_linux.x.x.xx.xxxx/

3. Edit /tmp/scheduler_linux.x.x.xx.xxxx/schedule_install.xml , example quoted below:

 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!-- 
 XML configuration file for JobScheduler setup

 The JobScheduler is available with a dual licensing model.
 - GNU GPL 2.0 License (see http://www.gnu.org/licenses/gpl-2.0.html)
 - JobScheduler Commercial License (see licence.txt)

 The setup asks you for the desired license model 
 (see <entry key="licenceOptions" .../> below).

 If you call the setup with this XML file then you accept 
 at the same time the terms of the chosen license agreement. 
 -->
 <AutomatedInstallation langpack="eng">
  <com.izforge.izpack.panels.UserInputPanel id="home">
   <userInput/>
  </com.izforge.izpack.panels.UserInputPanel>
  <com.izforge.izpack.panels.UserInputPanel id="licences">
   <userInput>
   
    <!-- Select the license model (GPL or Commercial) -->
    <entry key="licenceOptions" value="GPL"/>
    
    <!-- If you selected GPL as license model than the licence must be empty.
      Otherwise please enter a license key if available.
      It is also possible to modify the license key later. -->
    <entry key="licence" value=""/>
    
   </userInput>
  </com.izforge.izpack.panels.UserInputPanel>
  <com.izforge.izpack.panels.HTMLLicencePanel id="gpl_licence"/>
  <com.izforge.izpack.panels.HTMLLicencePanel id="commercial_licence"/>
  <com.izforge.izpack.panels.TargetPanel id="target">
   
   <!-- SELECT THE INSTALLATION PATH FOR THE BINARIES AND LIBRARIES
     The installation expands this path with the Scheduler ID as subdirectory.
     The path must be absolute!
     Default paths are
     /opt/sos-berlin.com/jobscheduler for Unix
     C:\Program Files\sos-berlin.com\jobscheduler for Windows -->
   <installpath>/opt/sos-berlin.com/jobscheduler</installpath>
   
  </com.izforge.izpack.panels.TargetPanel>
  <com.izforge.izpack.panels.UserPathPanel id="userpath">
   
   <!-- SELECT THE DATA PATH FOR CONFIGURATION AND LOG FILES
     The installation expands this path with the Scheduler ID as subdirectory.
     The path must be absolute!
     Default paths are
     /home/[user]/sos-berlin.com/jobscheduler for Unix
     C:\ProgramData\sos-berlin.com\jobscheduler for newer Windows
     C:\Documents and Settings\All Users\Application Data\sos-berlin.com\jobscheduler for older Windows -->
   <UserPathPanelElement>/home/[Linux Username]/sos-berlin.com/jobscheduler</UserPathPanelElement>
   
  </com.izforge.izpack.panels.UserPathPanel>
  <com.izforge.izpack.panels.PacksPanel id="package">
  
   <!-- SELECT THE PACKS WHICH YOU WANT INSTALL -->
      
   <!-- Package: JobScheduler
     JobScheduler Basic Installation
     THIS PACK IS REQUIRED. IT MUST BE TRUE -->
   <pack index="0" name="Job Scheduler" selected="true"/>
   
   <!-- Package: Update Service
     It checks every week, if a new release has been made. -->
   <pack index="1" name="Update Service" selected="false"/>
   
   <!-- Package: Database Support
     Job history and log files can be stored in a database. Database support is 
     available for MySQL, PostgreSQL, Firebird, Oracle, SQL Server, DB2.
     This package is strongly recommended. -->
   <pack index="2" name="Database Support" selected="true"/>
   
   <!-- Package: Housekeeping Jobs
     Housekeeping Jobs are automatically launched by the Job Scheduler, e.g. to send 
     buffered logs by mail, to remove temporary files or to restart the JobScheduler. -->
   <pack index="5" name="Housekeeping Jobs" selected="true"/>
   
   <!-- Package: MySQL Maintenance Jobs
     The job package for MySQL includes jobs for monitoring of replications. 
     MySQL database support is required to operate this feature. -->
   <pack index="6" name="MySQL" selected="true"/>
   
   <!-- Package: Cron Job
     THIS PACKAGE IS ONLY FOR UNIX.
     The Cron Adapter Job can be used to configure the JobScheduler with a crontab file. 
     For that purpose, the Job reads the crontab file and dynamically adjusts the 
     JobScheduler configuration. -->
   <pack index="7" name="Cron" selected="false"/>
   
  </com.izforge.izpack.panels.PacksPanel>
  <com.izforge.izpack.panels.UserInputPanel id="network">
   <userInput>
    <!-- Network Configuration -->
    
    <!-- Enter the name or ip address of the host on which the JobScheduler is operated -->
    <entry key="schedulerHost" value="192.168.0.11"/>
    
    <!-- Enter the port for TCP communication -->
    <entry key="schedulerPort" value="4444"/>
    
    <!-- To enter a JobScheduler ID is required. 
      The IDs of multiple instances of the JobScheduler must be unique per server. 
      The JobScheduler ID expands the above installation paths as subdirectory.
      Please omit special characters like: / \ : ; * ? ! $ % & " < > ( ) | ^ -->
    <entry key="schedulerId" value="scheduler"/>
    
    <!-- It is recommended to enable TCP access for the host where the JobScheduler will install, 
      optionally enter additional host names or ip addresses. To enable all hosts in your 
      network to access the JobScheduler enter '0.0.0.0'. -->
    <entry key="schedulerAllowedHost" value="0.0.0.0"/>
    
    <!-- Choose (yes or no) wether the JobScheduler should be started at the end of the installation -->
    <entry key="launchScheduler" value="yes"/>
    
   </userInput>
  </com.izforge.izpack.panels.UserInputPanel>
  <com.izforge.izpack.panels.UserInputPanel id="cluster">
   <userInput>
    <!-- Cluster Configuration -->
    
    <!-- The JobScheduler can be installed independent of other possibly JobSchedulers, 
      as a primary JobScheduler in a backup system or as a backup JobScheduler. 
      Use '' for a standalone, '-exclusive' for a primary 
      or '-exclusive -backup' for a backup JobScheduler.
      A database is required for a backup system. All JobSchedulers in a backup system 
      must have the same JobScheduler ID and the same database. 
      Further you can set '-distributed-orders' for a load balancing cluster.
      For more information see
      http://www.sos-berlin.com/doc/en/scheduler/sos_help.htm?help_URL=scheduler.backup.htm
      http://www.sos-berlin.com/doc/en/scheduler/sos_help.htm?help_URL=scheduler.distributed_orders.htm -->
    <entry key="clusterOptions" value=""/>
    
   </userInput>
  </com.izforge.izpack.panels.UserInputPanel>
  <com.izforge.izpack.panels.UserInputPanel id="smtp">
   <userInput>
    <!-- Mail Recipients Configuration / SMTP Authentication -->
    
    <!-- Enter the ip address or host name and port (default: 25) of your SMTP server -->
    <entry key="mailServer" value="smtp.163.com"/>
    <entry key="mailPort" value="25"/>
    
    <!-- Configure the SMTP authentication if necessary. -->
    <entry key="smtpAccount" value="abc@163.com"/>
    <entry key="smtpPass" value="bca"/>
    
    <!-- Enter the addresses of recipients to which mails with log files are automatically
      forwarded. Separate multiple recipients by commas -->
    
    <!-- Account from which mails are sent -->
    <entry key="mailFrom" value="SOSJobScheduler@163.com"/>
    
    <!-- Recipients of mails -->
    <entry key="mailTo" value="[Linux Username]@domain.com"/>
    
    <!-- Recipients of carbon copies: -->
    <entry key="mailCc" value=""/>
    
    <!-- Recipients of blind carbon copies -->
    <entry key="mailBcc" value=""/>
    
   </userInput>
  </com.izforge.izpack.panels.UserInputPanel>
  <com.izforge.izpack.panels.UserInputPanel id="email">
   <userInput>
    <!-- Mail Configuration / Event Handler -->
    
    <!-- Choose in which cases mails with log files are automatically forwarded. -->
    <entry key="mailOnError" value="yes"/>
    <entry key="mailOnWarning" value="yes"/>
    <entry key="mailOnSuccess" value="no"/>
    
    <!-- The Housekeeping package is required for configure JobScheduler as event handler
      Choose this option if you intend to use JobScheduler Events and
      - this JobScheduler instance is the only instance which processes Events
      - this JobScheduler instance is a supervisor for other JobSchedulers which submit Events -->
    <entry key="jobEvents" value="off"/> 
    
   </userInput>
  </com.izforge.izpack.panels.UserInputPanel>
  <com.izforge.izpack.panels.UserInputPanel id="update">
   <userInput>
    <!-- Update Configuration 
      These entries are only necessary if the package 'Update Service' is chosen. -->
    
    <!-- The JobScheduler checks every week if a new release has been made. In this case 
      you will receive an email. Furthermore an automatic download of the update can be 
      started which will save the 'scheduler_(win32|linux|solaris)_update.(zip|tar.gz)' 
      file in the JobScheduler installation directory. -->
      
    <!-- Enter the start time in the format HH:MM -->
    <entry key="checkForUpdateStarttime" value="20:00"/>
    
    <!-- Select the weekday via '0' for sunday, '1' for monday , ... and '6' for saturday. -->
    <entry key="checkForUpdateStartday" value="1"/>
    
    <!-- Choose '1' for automatic download, otherwise '0'. -->
    <entry key="autoUpdateDownload" value="0"/>
    
   </userInput>
  </com.izforge.izpack.panels.UserInputPanel>
  <com.izforge.izpack.panels.UserInputPanel id="database">
   <userInput>
    <!-- Database Configuration 
      These entries are only necessary if the package 'Database Support' is chosen.-->
      
    <!-- Choose the database management system. Supported values are 'mysql' for MySQL,
      'oracle' for Oracle, 'mssql' for MS SQL Server, 'pgsql' for PostgreSQL,
      'fbsql' for Firebird, 'db2' for DB2 and 'sybase' for Sybase. -->
    <entry key="databaseDbms" value="mysql"/>
    
    <!-- You can choose between 'on' or 'off' to create the database tables.
      If you have modified the initial data of an already existing installation, 
      then the modifications will be undone. Data added remains unchanged. 
      This entry should be only 'off', when you sure, that all tables are already created. -->
    <entry key="databaseCreate" value="on"/>
    
   </userInput>
  </com.izforge.izpack.panels.UserInputPanel>
  <com.izforge.izpack.panels.UserInputPanel id="dbconnection">
   <userInput>
    <!-- Database Configuration 
      These entries are only necessary if the package 'Database Support' is chosen. -->
      
    <!-- Enter the name or ip address of the database host -->
    <entry key="databaseHost" value="192.168.0.20"/>
    
    <!-- Enter the port number for the database instance. Default ports are for MySQL 3306, 
      Oracle 1521, MS SQL Server 1433, postgreSQL 5432, Firebird 3050, DB2 50000, Sybase 5000. -->
    <entry key="databasePort" value=""/>
    
    <!-- Enter the schema -->
    <entry key="databaseSchema" value="jobscheduler"/>
    
    <!-- Enter the user name for database access -->
    <entry key="databaseUser" value="[Linux Username]"/>
    
    <!-- Enter the password for database access -->
    <entry key="databasePassword" value="eidde"/>
    
    <!-- You must provide the MySQL, MS SQL Server or Sybase JDBC Driver respectively if you selected 
      corresponding DBMS type. For license reasons MySQL and MS SQL Server JDBC Drivers are 
      not provided. Alternatively you can use the jTDS JDBC Driver for MS SQL Server and Sybase 
      which is provided.-->
      
    <!-- You can choose between 'yes' or 'no' for using the jTDS JDBC Driver
      This entry has only an effect for MS SQL Server or Sybase -->
    <entry key="connectorJTDS" value="yes"/>
    
   </userInput>
  </com.izforge.izpack.panels.UserInputPanel>
  <com.izforge.izpack.panels.UserInputPanel id="jdbc">
   <userInput>
    <!-- Configuration for JDBC Driver 
      This entry is only necessary if the package 'Database Support' is chosen and you 
      selected a DBMS type like MySQL, MS SQL Server or Sybase in the previous 
      <userInput> element. -->
      
    <!-- You must provide the MySQL, MS SQL Server or Sybase JDBC Driver respectively if you selected 
      corresponding DBMS type. For license reasons MySQL and MS SQL Server JDBC Drivers are 
      not provided. Specify the JDBC Driver source (e.g. mysql-connector-java-*.jar for MySQL, 
      sqljdbc.jar for MS SQL Server, jconn3.jar for Sybase). Alternatively you can use the 
      jTDS JDBC Driver for MS SQL Server and Sybase which is provided. -->
      
    <!-- Select the path to JDBC Driver -->
    <entry key="connector" value="/tmp/jobscheduler.1.3.12.2347/mysql-connector-java-5.1.18-bin.jar"/>
    
   </userInput>
  </com.izforge.izpack.panels.UserInputPanel>
  <com.izforge.izpack.panels.UserInputPanel id="cron">
   <userInput>
    <!-- Configuration for Cron Job
      This input panel is ONLY FOR UNIX AVAILABLE
      These values will be ignored under Windows -->
    
    <!-- Enter the crontab path -->
    <entry key="cronCrontab" value="/etc/crontab"/>
    
    <!-- Select system crontab (1) or user crontab (0) -->
    <entry key="cronSystab" value="1"/>
    
    <!-- Enter the default job timeout (in s)
      The value must greater than 0 -->
    <entry key="cronTimeout" value="600"/>
    
    <!-- For system crontabs enter the preprocessing type 
      su      for su [user] -c [command]
      sudo    for sudo -u [user] [command]
      (empty) for custom change user command -->
    <entry key="cronChangeUser" value=""/>
    
    <!-- Enter the custom change user command -->
    <entry key="cronChangeCommand" value=""/>
    
   </userInput>
  </com.izforge.izpack.panels.UserInputPanel>
  <com.izforge.izpack.panels.InstallPanel id="install"/>
  <com.izforge.izpack.panels.ProcessPanel id="process"/>
  <com.izforge.izpack.panels.FinishPanel id="finish"/>
 </AutomatedInstallation>

4. Start installation by the following command
 /tmp/scheduler_linux.x.x.xx.xxxx/setup.sh scheduler_install.xml

5. Test the instatllation by going to http://localhost:4444

6. install php complier
 apt-get install php5-cli

7. Open /home/[Linux Username]/sos-berlin.com/jobscheduler/config/scheduler.xml, add the following codes just between <http_server>... ...</http_server> and  </config>

 <jobs>
  <job name = "my_php_script">
     <process file   = "/usr/lib/apache2/modules/libphp5.so"
     <!-- "/usr/src/php-4.3.3/sapi/cli/php"  -->
     <!-- in Windows meist "c:\php\cli\php.exe" -->
     param  = "-f jobs/my_php_script.php">
     </process>
     <run_time/>
  </job>
 </jobs> 

8. Create a php file 
 /home/[Linux Username]/sos-berlin.com/jobscheduler/jobs/my_php_script.php , contents as belows:

 <?php
 echo "Hello World. PHP"
 ?> 
 
9. Restart the jobscheduler service
 /opt/sos-berlin.com/jobscheduler/scheduler/bin/jobscheduler.sh stop
 /opt/sos-berlin.com/jobscheduler/scheduler/bin/jobscheduler.sh start
 
10. Completed


Further Reading:
SOS Job Scheduler - PHP XML Interface

...

Tuesday, May 11, 2010

phpTrafficA

http://soft.zoneo.net/phpTrafficA/install.php?l=en

phpTrafficA is a GPL statistical tool for website monitoring, written in php and mySQL. It can track access counts to your website, search engines, keywords, and referrers that lead to you, operating systems, web browsers, visitor retention, traffic patterns, visitor path, and a lot more!

demo
http://soft.zoneo.net/phpTrafficA/Demo/