Tuesday, September 11, 2012

Eclipse IDE for Symfony2 developers

After looking for a good Symfony 2 IDE I found Eclipse to offer a good solution for what I needed. I did see this post on how to setup Eclipse for Symfony 2 but it's a little out dated. Post #1 First download the Zend Eclipse IDE for your OS Flavor, Me I'm running Ubuntu 12.04 LTS 64BIT. Zend Eclipse IDE - Community Edition ( Yeah it's FREE ) Now the Paid version of Zend IDE you can download all the plugins from this list Zend Eclipse IDE Plugins List But I found you can also install then yourself in the Community Edition. Now I haven't been able to find them all but if you see one on the list that I don't provide a update site link to, Please comment and I will add it. Here are the plugins I use: Here are some others I have found but have not installed it's still a work in progress, let me know what works for you

Saturday, November 05, 2011

Name Virtual Host

Edit httpd.conf

sudo vi /etc/apache2/httpd.conf
Add this line

NameVirtualHost *:80
NOTE: You can replace *:80 with your_ip_address:80

Now create the domain name config file. I use the domain_name.com

sudo vi /etc/apache2/sites-available/domain.com
Add this to the file


ServerAdmin admin@domain.com
ServerName www.domain.com
ServerAlias domain.com
DocumentRoot /var/www/domain.com/public_html/
ErrorLog /var/www/domain.com/logs/error.log
CustomLog /var/www/domain.com/logs/access.log combined

Make sure the directories in the domain.com config exists

/var/www/domain.com/public_html/
/var/www/domain.com/logs
NOTE: use the mkdir command like this if needed

sudo mkdir /var/www/domain.com/public_html/
sudo mkdir /var/www/domain.com/logs
Now we need to enable the new config file like this

sudo a2ensite domain.com
You should see a notice to restart apache, use this command

/etc/init.d/apache2 restart
Now we need a test file to view

sudo vi /var/www/domain.com/public_html/index.html
Add some text

Hello domain.com
Open your web browser and go to your new domain

http://domain.com

Wednesday, July 27, 2011

Prado and installing PHPExcel - Auto Loading bug

Well this was a headache and then some.

The problem is Prado has a Auto Loading process that can cause 3rd party or additional libraries to break and act strange if they also have a Auto Loading process.

The Solution is to turn off Prado's Auto Loading process, Load the 3rd party/Additional library and then turn Prado's Auto Loading process back on.

Here is what it looks like: (In this example I'm using the namespace instead of the path alias)


$phpExcelPath = Prado::getPathOfNamespace('Application.Core.php_excel.Classes');

// Disable Prado Auto Loading process
spl_autoload_unregister(array('Prado','autoload'));

// Add PHP Excel
require_once($phpExcelPath.'/PHPExcel.php');
require_once($phpExcelPath.'/PHPExcel/Writer/Excel2007.php');

// Do PHP Excel stuff here

// Reload Prado Auto Loading process
spl_autoload_register(array('Prado','autoload'));



Reference: http://www.ramirezcobos.com/2010/11/05/how-to-use-phpexcel-with-yii/
They are using YII but the process is very similar

There is a discussion here for possibly more information regarding this issue.

Monday, May 16, 2011

PHP Logger Class


/**
 * Logger
 *
 * Usage:
 *
 * Logger::getInstance()->setLogFileDirectory('/path/to/log/file/directory');
 *
 * Logger::getInstance()->info('Set info log message');
 * Logger::getInstance()->warning('Set warning log message');
 * Logger::getInstance()->error('Set error log message');
 * Logger::getInstance()->notice('Set notice log message');
 * Logger::getInstance()->debug('Set debug log message');
 *
 * Logger::getInstance()->enableDebug();
 * Logger::getInstance()->disableDebug();
 *
 * Logger::getInstance()->returnErrorMessages($boolean);
 */

class Logger {
    private $log_file_directory = ''; // Required
    private $first_run;         // Flag to add line break at the beginning of script execution
    private $calling_script;     // Base name of the calling script
    private $log_file;           // log file path and name
    private $log_file_name; // You can override the logfile name
    private $log_entry;         // information to be logged
    private $log_level;         // Log severity levels: error, warning, notice, debug, info
    private $fh;                 // File handle
    private $file_name;         // File path and name
    private $file_parts;         // Array of $file_name
    private $script_name;       // Script Name
    private $script_parts;       // Array of $script_name
    private $line_number_arr;   // Line number of where the logging event occurred
    private $debug_flag = false;
    private $log_file_date;     // datestamp for log file name
    private $return_error_messages = false; // Boolean: if false will echo error message else return error message
    private static $instance = null;

    private function __construct() {
        $this->first_run        = true;
        $this->calling_script   = '';      
        $this->log_file         = '';
        $this->log_entry        = '';
        $this->log_level        = '';
        $this->fh               = '';
        $this->file_name        = '';
        $this->file_parts       = '';
        $this->script_name      = '';
        $this->script_parts     = '';  
        $this->line_number_arr  = '';
$this->log_file_name = '';
    }

/**
* Get Instance
*
* @param
* @return object
*/
    public static function getInstance() {
        if(!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }
        return self::$instance;
    }

    /**
     * Enable Debug
     *
     * @param
     * @return
     */
    public function enableDebug() {
        $this->debug_flag = true;
    }

    /**
     * Disable Debug
     *
     * @param
     * @return
     */
    public function disableDebug() {
        $this->debug_flag = false;
    }

    /**
     * Info
     *
     * @param string
     * @return
     */
    public function info($info_message) {
        $this->log_level = 'info';
        $this->line_number_arr = debug_backtrace();
        return $this->addEntry($info_message);
    }

    /**
     * Error
     *
     * @param string
     * @return
     */
    public function error($error_message) {
        $this->log_level = 'error';
        $this->line_number_arr = debug_backtrace();
        return $this->addEntry($error_message);
    }

    /**
     * Warning
     *
     * @param string
     * @return
     */
    public function warning($warning_message) {
        $this->log_level = 'warning';
        $this->line_number_arr = debug_backtrace();
        return $this->addEntry($warning_message);
    }

    /**
     * Notice
     *
     * @param string
     * @return
     */
    public function notice($notice_message) {
        $this->log_level = 'notice';
        $this->line_number_arr = debug_backtrace();
        return $this->addEntry($notice_message);
    }

    /**
     * Debug
     *
     * @param string
     * @return
     */
    public function debug($debug_message) {
        if($this->debug_flag) {
            $this->log_level = 'debug';
            $this->line_number_arr = debug_backtrace();
            return $this->addEntry($debug_message);
        }      
    }

/**
     * Add Entry
     *
     * @param string
     * @return
     */
    private function addEntry($message) {
    if($this->log_file_directory == '') {
    $error_message = 'Please set the Log File Directory - Logger::getInstance()->setLogFileDirectory("/path/to/log/file/directory")'."\n";
   
if(!$this->return_error_messages) {
echo $error_message;
return;
}
return $error_message;
}
    $newline = "";
$tab = "";

if($this->getLogFileName() != '') {
$this->calling_script = $this->getLogFileName();
} else {
$this->calling_script = $this->getScriptBaseName();
}
       
        $this->log_file = $this->log_file_directory."/".$this->calling_script.".".$this->getLogDate().".log";
       
        if(!file_exists($this->log_file)) {
            $this->first_run = false;
            $this->line_count = 0;
        }

        if(!($this->fh = @fopen($this->log_file, 'a'))) {
        $error_message = 'Problem with Log File: '.$this->log_file."\n";

if(!$this->return_error_messages) {
echo $error_message;
return;
}
return $error_message;
        }

if($this->log_level == 'info') {
$tab = "\t";
}
           
        if($this->first_run) {
        $newline = "\n";
        }

$this->log_entry = $newline."[".date("Y-m-d H:i:s",mktime())."][line:".$this->line_number_arr[0]['line']."|".$this->log_level."]:\t".$tab.$message."\n";

        fwrite($this->fh, $this->log_entry);
        fclose($this->fh);
       
        $this->first_run = false;
        $this->line_count++;
    }

/**
     * Get Script Base Name
     *
     * @param
     * @return string
     */
    private function getScriptBaseName() {
        $this->setLogDate(date("Ymd"));
       
        $this->file_name    = $_SERVER["SCRIPT_NAME"];
        $this->file_parts   = explode('/', $this->file_name);
        $this->script_name  = $this->file_parts[count($this->file_parts) - 1];
        $this->script_parts = explode('.', $this->script_name);

        return implode(".",array_slice($this->script_parts, 0, (count($this->script_parts) - 1)));
    }

/**
     * Set Log Date
     *
     * @param string
     * @return
     */
    private function setLogDate($value) {
        $this->log_file_date = $value;
    }
   
    /**
     * Get Log Date
     *
     * @param
     * @return string
     */
    private function getLogDate() {
        return $this->log_file_date;
    }

/**
* Set Log File Directory
*
* @param string
* @return
*/
public function setLogFileDirectory($log_file_directory) {
$this->log_file_directory = $log_file_directory;
}

/**
* Get Log File Directory
*
* @param
* @return string
*/
public function getLogFileDirectory() {
return $this->log_file_directory;
}

/**
* Return Error Message
*
* @param boolean
* @return
*/
public function returnErrorMessages($boolean) {
if(is_bool($boolean)) {
$this->return_error_messages = $boolean;
}
}

/**
* Set Log File name (Override)
*
* @param string
* @return
*/
public function setLogFileName($log_file_name) {
$this->log_file_name = $log_file_name;
}

/**
* Get Log File name
*
* @param
* @return string
*/
private function getLogFileName() {
return $this->log_file_name;
}
}

?>

Friday, May 13, 2011

PHP Mail Class


/**
 * Email
 *
 * @usage:
 *
 * Email::getInstance()->setEmailTo('you@email.com');
 * Email::getInstance()->setEmailFrom('me@email.com');
 * Email::getInstance()->setEmailFromName('My Name');
 * Email::getInstance()->setEmailReplyTo('replyToMe@email.com');
 * Email::getInstance()->setEmailCc('ccMe@email.com');
 * Email::getInstance()->setEmailBcc('bccMe@email.com');
 * Email::getInstance()->setEmailSubject('Subject');
 * Email::getInstance()->setEmailMessage('Message');
 * Email::getInstance()->setEmailMessageWithHtml('HTML Message');
 * Email::getInstance()->setEmailAttachment('attachment.txt');
 *
 * echo Email::getInstance()->sendEmail(); // will start a new instance when sending the email
 */

class Email {
    private $emailTo;
    private $emailFrom;
    private $emailFromName;
    private $emailCc;
    private $emailBcc;
    private $emailReplyTo;
    private $emailSubject;
    private $emailMessage;
    private $emailMessageWithHtml;
    private $emailHeader;
    private $emailAttachment;
    private $emailAttachmentFileName;
    private $emailAttachmentMimeType;
    private static $instance = null;
   
/**
* Constructor
*
* @param
* @return
*/
    public function __construct() {
        $this->emailTo                  = '';
        $this->emailFrom                = '';
        $this->emailFromName            = '';
        $this->emailCc                  = '';
        $this->emailBcc                 = '';
        $this->emailReplyTo             = '';
        $this->emailSubject             = '';
        $this->emailMessage             = '';
        $this->emailMessageWithHtml     = '';
        $this->emailHeader              = '';
        $this->emailAttachment          = '';
        $this->emailAttachmentFileName  = '';
        $this->emailAttachmentMimeType  = '';
    }
   
    /**
     * Get Instance
     *
     * @param
     * @return object
     */
    public static function getInstance() {
        if(!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }
        return self::$instance;
    }
   
/**
* New Instance
*
* @param
* @return object
*/
    private static function newInstance() {
        if(isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }
        return self::$instance;
    }
   
/**
* Send Email
*
* @param
* @return string
*/
    public function sendEmail() {
        $emailStatusMessage = "";

        if($this->emailFromName() != '') {
            $this->setEmailHeader($this->emailHeader()."From: ".$this->emailFromName()." <".$this->emailFrom().">\r\n");
        } else {
            $this->setEmailHeader($this->emailHeader()."From: ".$this->emailFrom()." \r\n");
        }
       
        if($this->emailReplyTo() != '') {
            $emailStatusMessage .= " Reply-To: ".$this->emailReplyTo();
            $this->setEmailHeader($this->emailHeader()."Reply-To: ".$this->emailReplyTo()." \r\n");
        }
 
        if($this->emailCc() != '') {
            $emailStatusMessage .= " cc: ".$this->emailCc();
            $this->setEmailHeader($this->emailHeader()." Cc: ".$this->emailCc()." \r\n");
        }
       
        if($this->emailBcc() != '') {
            $emailStatusMessage .= " bcc: ".$this->emailBcc();
            $this->setEmailHeader($this->emailHeader()." BCC: ".$this->emailBcc()." \r\n");
        }
       
        if($this->emailMessageWithHtml() !='' || $this->emailAttachment() != '') {
            $this->setEmailHeader($this->emailHeader()."MIME-Version: = 1.0\r\n");
        }
       
        if($this->emailAttachment() != '') {
            $fileName   = empty($this->emailAttachmentFileName) ? basename($this->emailAttachment) : $this->emailAttachmentFileName;
            $path       = dirname($this->emailAttachment);

            $file       = $path.'/'.$fileName;
            $fileSize   = filesize($file);
            $handle     = fopen($file,"r");
            $content    = fread($handle, $fileSize);
            fclose($handle);
           
            $content    = chunk_split(base64_encode($content));
            $uid        = md5(uniqid(time()));
            $name       = basename($file);
           
            $mimeType   = $this->mimeType($file);

if($mimeType == '') {
$returnEmailStatusMessage = "Email Notification was NOT sent as the MIME TYPE was not found for the file: '".$file."' for this email to: ".$this->emailTo()."".$emailStatusMessage;
           $this->newInstance();
           return $returnEmailStatusMessage;
}
           
            $this->setEmailHeader($this->emailHeader()."Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n");
            $this->setEmailHeader($this->emailHeader()."This is a multi-part message in MIME format.\r\n");
            $this->setEmailHeader($this->emailHeader()."--".$uid."\r\n");
           
            if($this->emailMessageWithHtml() != '') {
                $emailStatusMessage .= ", Email is HTML";
                $this->setEmailHeader($this->emailHeader()."Content-type:text/html;charset=iso-8859-1\r\n");
            } else {
                $this->setEmailHeader($this->emailHeader()."Content-type:text/plain; charset=iso-8859-1\r\n");
            }

            $this->setEmailHeader($this->emailHeader()."Content-Transfer-Encoding: 7bit\r\n\r\n");
            $this->setEmailHeader($this->emailHeader().$this->emailMessage()."\r\n\r\n");
            $this->setEmailHeader($this->emailHeader()."--".$uid."\r\n");
            $this->setEmailHeader($this->emailHeader()."Content-Type: ".$mimeType."; name=\"".$fileName."\"\r\n");
            $this->setEmailHeader($this->emailHeader()."Content-Transfer-Encoding: base64\r\n");
            $this->setEmailHeader($this->emailHeader()."Content-Disposition: attachment; filename=\"".$fileName."\"\r\n\r\n");
            $this->setEmailHeader($this->emailHeader().$content."\r\n\r\n");
            $this->setEmailHeader($this->emailHeader()."--".$uid."--");
           
            $emailStatusMessage .= ", Email has attachment: ".$fileName;
            $this->setEmailMessage("");
        } elseif($this->emailMessageWithHtml() != '') {
            $emailStatusMessage .= ", Email is HTML";
            $this->setEmailHeader($this->emailHeader()."Content-type:text/html;charset=iso-8859-1\r\n");
        }
       
        try {
            mail(
                $this->emailTo(),
                $this->emailSubject(),
                $this->emailMessage(),
                $this->emailHeader()
            );

            $returnEmailStatusMessage = "Email Notification was successfully sent to: ".$this->emailTo()."".$emailStatusMessage;
            $this->newInstance();
            return $returnEmailStatusMessage;
        } catch (Exception $e) {
            $returnEmailStatusMessage = "ERROR: Email Notification was not sent to: ".$this->emailTo()."".$emailStatusMessage." Caught exception: ".$e->getMessage();
            $this->newInstance();
            return $returnEmailStatusMessage;
        }
    }

/**
* Set Email Attachment Mime Type
*
* @param string
* @return
*/
    public function setEmailAttachmentMimeType($emailAttachmentMimeType) {
        $this->emailAttachmentMimeType = $emailAttachmentMimeType;
    }
   
/**
* Email Attachment Mime Type
*
* @param
* @return string
*/
    public function emailAttachmentMimeType() {
        return $this->emailAttachmentMimeType;
    }
   
/**
* Set Email Attachment File Name
*
* @param string
* @return
*/
    public function setEmailAttachmentFileName($emailAttachmentFileName) {
        $this->emailAttachmentFileName = $emailAttachmentFileName;
    }
   
    /**
* Email Attachment File Name
*
* @param
* @return string
*/
    public function emailAttachmentFileName() {
        return $this->emailAttachmentFileName;
    }
   
/**
* Set Email Attacchment
*
* @param string
* @return
*/
    public function setEmailAttachment($emailAttachment) {
        $this->emailAttachment = $emailAttachment;
    }
   
    /**
* Email Attachment
*
* @param
* @return string
*/
    public function emailAttachment() {
        return $this->emailAttachment;
    }
   
/**
* Set Email To
*
* @param string
* @return
*/
    public function setEmailTo($emailTo) {
        $this->emailTo = $emailTo;
    }
   
/**
* Email To
*
* @param
* @return string
*/
    public function emailTo() {
        return $this->emailTo;
    }
   
/**
* Set Email From
*
* @param string
* @return
*/
    public function setEmailFrom($emailFrom) {
        $this->emailFrom = $emailFrom;
    }
   
/**
* Email From
*
* @param
* @return string
*/
    public function emailFrom() {
        return $this->emailFrom;
    }
   
/**
* Set Email From Name
*
* @param string
* @return
*/
    public function setEmailFromName($emailFromName) {
        $this->emailFromName = $emailFromName;
    }
   
/**
* Email From Name
*
* @param
* @return string
*/
    public function emailFromName() {
        return $this->emailFromName;
    }
   
/**
* Set Email Reply To
*
* @param string
* @return
*/
    public function setEmailReplyTo($emailReplyTo) {
        $this->emailReplyTo = $emailReplyTo;
    }
   
/**Email Reply To
*
*
* @param
* @return string
*/
    public function emailReplyTo() {
        return $this->emailReplyTo;
    }
   
/**
* Set Email CC
*
* @param string
* @return
*/
    public function setEmailCc($emailCc) {
        $this->emailCc = $emailCc;
    }
   
/**
* Email CC
*
* @param
* @return string
*/
    public function emailCc() {
        return $this->emailCc;
    }
   
/**
* Set Email BCC
*
* @param string
* @return
*/
    public function setEmailBcc($emailBcc) {
        $this->emailBcc = $emailBcc;
    }
   
/**
* Email BCC
*
* @param
* @return string
*/
    public function emailBcc() {
        return $this->emailBcc;
    }
   
/**
* Set Email Subject
*
* @param string
* @return
*/
    public function setEmailSubject($emailSubject) {
        $this->emailSubject = $emailSubject;
    }
   
/**
* Email Subject
*
* @param
* @return string
*/
    public function emailSubject() {
        return $this->emailSubject;
    }
   
/**
* Set Email Message
*
* @param string
* @return
*/
    public function setEmailMessage($emailMessage) {
        $this->emailMessage = $emailMessage;
    }
   
/**
* Email Message
*
* @param
* @return string
*/
    public function emailMessage() {
    if(is_array($this->emailMessage)) {
    return implode("\n\r", $this->emailMessage);
    }
        return $this->emailMessage;
    }
   
/**
* Set Email Message With HTML
*
* @param string
* @return
*/
    public function setEmailMessageWithHtml($emailMessageWithHtml) {
        $this->emailMessageWithHtml = $emailMessageWithHtml;
        $this->setEmailMessage($emailMessageWithHtml);
    }
   
/**
* Email Message With HTML
*
* @param
* @return string
*/
    public function emailMessageWithHtml() {
        return $this->emailMessageWithHtml;
    }
   
/**
* Set Email Header
*
* @param string
* @return
*/
    public function setEmailHeader($emailHeader) {
        $this->emailHeader = $emailHeader;
    }
   
/**
* Email Header
*
* @param
* @return string
*/
    public function emailHeader() {
        return $this->emailHeader;
    }
   
/**
* Mime Type
*
* @param string
* @return string
*/
    public function mimeType($file) {
        $mimeTypes = array(
            "323"       => "text/h323",
            "acx"       => "application/internet-property-stream",
            "ai"        => "application/postscript",
            "aif"       => "audio/x-aiff",
            "aifc"      => "audio/x-aiff",
            "aiff"      => "audio/x-aiff",
            "asf"       => "video/x-ms-asf",
            "asr"       => "video/x-ms-asf",
            "asx"       => "video/x-ms-asf",
            "au"        => "audio/basic",
            "avi"       => "video/x-msvideo",
            "axs"       => "application/olescript",
            "bas"       => "text/plain",
            "bcpio"     => "application/x-bcpio",
            "bin"       => "application/octet-stream",
            "bmp"       => "image/bmp",
            "c"         => "text/plain",
            "cat"       => "application/vnd.ms-pkiseccat",
            "cdf"       => "application/x-cdf",
            "cer"       => "application/x-x509-ca-cert",
            "class"     => "application/octet-stream",
            "clp"       => "application/x-msclip",
            "cmx"       => "image/x-cmx",
            "cod"       => "image/cis-cod",
            "cpio"      => "application/x-cpio",
            "crd"       => "application/x-mscardfile",
            "crl"       => "application/pkix-crl",
            "crt"       => "application/x-x509-ca-cert",
            "csh"       => "application/x-csh",
            "css"       => "text/css",
            "dcr"       => "application/x-director",
            "der"       => "application/x-x509-ca-cert",
            "dir"       => "application/x-director",
            "dll"       => "application/x-msdownload",
            "dms"       => "application/octet-stream",
            "doc"       => "application/msword",
            "dot"       => "application/msword",
            "dvi"       => "application/x-dvi",
            "dxr"       => "application/x-director",
            "eps"       => "application/postscript",
            "etx"       => "text/x-setext",
            "evy"       => "application/envoy",
            "exe"       => "application/octet-stream",
            "fif"       => "application/fractals",
            "flr"       => "x-world/x-vrml",
            "gif"       => "image/gif",
            "gtar"      => "application/x-gtar",
            "gz"        => "application/x-gzip",
            "h"         => "text/plain",
            "hdf"       => "application/x-hdf",
            "hlp"       => "application/winhlp",
            "hqx"       => "application/mac-binhex40",
            "hta"       => "application/hta",
            "htc"       => "text/x-component",
            "htm"       => "text/html",
            "html"      => "text/html",
            "htt"       => "text/webviewhtml",
            "ico"       => "image/x-icon",
            "ief"       => "image/ief",
            "iii"       => "application/x-iphone",
            "ins"       => "application/x-internet-signup",
            "isp"       => "application/x-internet-signup",
            "jfif"      => "image/pipeg",
            "jpe"       => "image/jpeg",
            "jpeg"      => "image/jpeg",
            "jpg"       => "image/jpeg",
            "js"        => "application/x-javascript",
            "latex"     => "application/x-latex",
            "lha"       => "application/octet-stream",
            "log"       => "text/plain",
            "lsf"       => "video/x-la-asf",
            "lsx"       => "video/x-la-asf",
            "lzh"       => "application/octet-stream",
            "m13"       => "application/x-msmediaview",
            "m14"       => "application/x-msmediaview",
            "m3u"       => "audio/x-mpegurl",
            "man"       => "application/x-troff-man",
            "mdb"       => "application/x-msaccess",
            "me"        => "application/x-troff-me",
            "mht"       => "message/rfc822",
            "mhtml"     => "message/rfc822",
            "mid"       => "audio/mid",
            "mny"       => "application/x-msmoney",
            "mov"       => "video/quicktime",
            "movie"     => "video/x-sgi-movie",
            "mp2"       => "video/mpeg",
            "mp3"       => "audio/mpeg",
            "mpa"       => "video/mpeg",
            "mpe"       => "video/mpeg",
            "mpeg"      => "video/mpeg",
            "mpg"       => "video/mpeg",
            "mpp"       => "application/vnd.ms-project",
            "mpv2"      => "video/mpeg",
            "ms"        => "application/x-troff-ms",
            "mvb"       => "application/x-msmediaview",
            "nws"       => "message/rfc822",
            "oda"       => "application/oda",
            "p10"       => "application/pkcs10",
            "p12"       => "application/x-pkcs12",
            "p7b"       => "application/x-pkcs7-certificates",
            "p7c"       => "application/x-pkcs7-mime",
            "p7m"       => "application/x-pkcs7-mime",
            "p7r"       => "application/x-pkcs7-certreqresp",
            "p7s"       => "application/x-pkcs7-signature",
            "pbm"       => "image/x-portable-bitmap",
            "pdf"       => "application/pdf",
            "pfx"       => "application/x-pkcs12",
            "pgm"       => "image/x-portable-graymap",
            "pko"       => "application/ynd.ms-pkipko",
            "pma"       => "application/x-perfmon",
            "pmc"       => "application/x-perfmon",
            "pml"       => "application/x-perfmon",
            "pmr"       => "application/x-perfmon",
            "pmw"       => "application/x-perfmon",
            "pnm"       => "image/x-portable-anymap",
            "pot"       => "application/vnd.ms-powerpoint",
            "ppm"       => "image/x-portable-pixmap",
            "pps"       => "application/vnd.ms-powerpoint",
            "ppt"       => "application/vnd.ms-powerpoint",
            "prf"       => "application/pics-rules",
            "ps"        => "application/postscript",
            "pub"       => "application/x-mspublisher",
            "qt"        => "video/quicktime",
            "ra"        => "audio/x-pn-realaudio",
            "ram"       => "audio/x-pn-realaudio",
            "ras"       => "image/x-cmu-raster",
            "rgb"       => "image/x-rgb",
            "rmi"       => "audio/mid",
            "roff"      => "application/x-troff",
            "rtf"       => "application/rtf",
            "rtx"       => "text/richtext",
            "scd"       => "application/x-msschedule",
            "sct"       => "text/scriptlet",
            "setpay"    => "application/set-payment-initiation",
            "setreg"    => "application/set-registration-initiation",
            "sh"        => "application/x-sh",
            "shar"      => "application/x-shar",
            "sit"       => "application/x-stuffit",
            "snd"       => "audio/basic",
            "spc"       => "application/x-pkcs7-certificates",
            "spl"       => "application/futuresplash",
            "src"       => "application/x-wais-source",
            "sst"       => "application/vnd.ms-pkicertstore",
            "stl"       => "application/vnd.ms-pkistl",
            "stm"       => "text/html",
            "svg"       => "image/svg+xml",
            "sv4cpio"   => "application/x-sv4cpio",
            "sv4crc"    => "application/x-sv4crc",
            "t"         => "application/x-troff",
            "tar"       => "application/x-tar",
            "tcl"       => "application/x-tcl",
            "tex"       => "application/x-tex",
            "texi"      => "application/x-texinfo",
            "texinfo"   => "application/x-texinfo",
            "tgz"       => "application/x-compressed",
            "tif"       => "image/tiff",
            "tiff"      => "image/tiff",
            "tr"        => "application/x-troff",
            "trm"       => "application/x-msterminal",
            "tsv"       => "text/tab-separated-values",
            "txt"       => "text/plain",
            "uls"       => "text/iuls",
            "ustar"     => "application/x-ustar",
            "vcf"       => "text/x-vcard",
            "vrml"      => "x-world/x-vrml",
            "wav"       => "audio/x-wav",
            "wcm"       => "application/vnd.ms-works",
            "wdb"       => "application/vnd.ms-works",
            "wks"       => "application/vnd.ms-works",
            "wmf"       => "application/x-msmetafile",
            "wps"       => "application/vnd.ms-works",
            "wri"       => "application/x-mswrite",
            "wrl"       => "x-world/x-vrml",
            "wrz"       => "x-world/x-vrml",
            "xaf"       => "x-world/x-vrml",
            "xbm"       => "image/x-xbitmap",
            "xla"       => "application/vnd.ms-excel",
            "xlc"       => "application/vnd.ms-excel",
            "xlm"       => "application/vnd.ms-excel",
            "xls"       => "application/vnd.ms-excel",
            "xlsx"      => "vnd.ms-excel",
            "xlt"       => "application/vnd.ms-excel",
            "xlw"       => "application/vnd.ms-excel",
            "xof"       => "x-world/x-vrml",
            "xpm"       => "image/x-xpixmap",
            "xwd"       => "image/x-xwindowdump",
            "z"         => "application/x-compress",
            "zip"       => "application/zip"
        );
       
        $extension = end(explode('.', $file));
        return $mimeTypes[$extension];
    }
}

?>

Monday, October 11, 2010

Ubuntu upgrading to 10.10 Apache hosts get overwritten

If anyone else goes through this just re-add your hosts to /etc/hosts and restart Apache, kept getting this error "(EAI 5)No address associated with hostname: Could not resolve host name".

Tuesday, October 05, 2010

Why are my PHP sessions timing out around 30 minutes?

Have been pulling out my hair trying to find out why my sessions are being terminated/killed/destroyed at 30 minutes. Well it looks like Debian based systems have a special cron running that ignores all php.ini and apache configurations and kills any idle session at 30 minutes.

The cron path: /etc/cron.d/php5

Inside the cron:


# /etc/cron.d/php5: crontab fragment for php5
# This purges session files older than X, where X is defined in seconds
# as the largest value of session.gc_maxlifetime from all your php.ini
# files, or 24 minutes if not defined. See /usr/lib/php5/maxlifetime

# Look for and purge old sessions every 30 minutes
09,39 * * * * root [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -n 200 -r -0 rm


/usr/lib/php5/maxlifetime code

#!/bin/sh -e

max=1440

for ini in /etc/php5/*/php.ini; do
cur=$(sed -n -e 's/^[[:space:]]*session.gc_maxlifetime[[:space:]]*=[[:space:]]*\([0-9]\+\).*$/\1/p' $ini 2>/dev/null || true);
[ -z "$cur" ] && cur=0
[ "$cur" -gt "$max" ] && max=$cur
done

echo $(($max/60))

exit 0


so it looks to be searching all the php.ini files, finds the greatest value, compares it to 1440 (which is 24 minutes).

Here are the php.ini files

/etc/php5/apache2/php.ini
session.gc_maxlifetime = 1440

/etc/php5/cgi/php.ini
session.gc_maxlifetime = 1440

/etc/php5/cli/php.ini
session.gc_maxlifetime = 1440


CRON running every 30 minutes is why the session looks to be killed at 30 minute intervals. But it could also be 24 to 54 minutes, FYI

Also looking over the code in: `/usr/lib/php5/maxlifetime` it's taking the highest value and during my testing I was trying to lower the threshold to speed up the condition (this is why we were getting mixed results).

So to configure a higher number is easy, just configure one of the php.ini files, set session.gc_maxlifetime to a higher value than 1440 and you might want to also change the cron execution times.

If you wanted a lower number you would have to edit ALL the php.ini files on your system as welll as the /usr/lib/php5/maxlifetime max= variable to the smaller number