<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tpoxa&#039;s blog &#187; PHP</title>
	<atom:link href="http://tpoxa.com/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://tpoxa.com</link>
	<description></description>
	<lastBuildDate>Mon, 23 Apr 2012 22:01:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Yii ConsoleApplication and Gearman Workers  PSD to JPEG conversation</title>
		<link>http://tpoxa.com/2012/03/07/yii-consoleapplication-and-gearman-workers-psd-to-jpeg-conversation/</link>
		<comments>http://tpoxa.com/2012/03/07/yii-consoleapplication-and-gearman-workers-psd-to-jpeg-conversation/#comments</comments>
		<pubDate>Tue, 06 Mar 2012 21:12:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Yii]]></category>
		<category><![CDATA[gearman]]></category>
		<category><![CDATA[workers]]></category>
		<category><![CDATA[yii]]></category>

		<guid isPermaLink="false">http://tpoxa.com/?p=338</guid>
		<description><![CDATA[Hi. I am going to provide small example of how I use gearman with my Yii applications. If someone doesn&#8217;t know what is gearman here is quick explanation from the official website http://gearman.org A Gearman powered application consists of three parts: a client, a worker, and a job server. The client is responsible for creating [...]]]></description>
			<content:encoded><![CDATA[<p>Hi. I am going to provide small example of how I use gearman with my Yii applications.<br />
If someone doesn&#8217;t know what is gearman here is quick explanation from the official website  <a href="http://gearman.org">http://gearman.org</a></p>
<blockquote><p>A Gearman powered application consists of three parts: a client, a worker, and a job server. The client is responsible for creating a job to be run and sending it to a job server. The job server will find a suitable worker that can run the job and forwards the job on. The worker performs the work requested by the client and sends a response to the client through the job server. Gearman provides client and worker APIs that your applications call to talk with the Gearman job server (also known as gearmand) so you don&#8217;t need to deal with networking or mapping of jobs. Internally, the gearman client and worker APIs communicate with the job server using TCP sockets.</p></blockquote>
<p>Our example application converts psd to jpeg. We have to install <strong>gearman job server</strong>, <strong>gearman pecl extension</strong> and <strong>ImageMagick</strong> on the server.<br />
<span id="more-338"></span><br />
We will use standart Yii application skeleton as playground. </p>
<p>First of all we gonna create new folder within our protected folder called &#171;workers&#187;.<br />
As our console application use separate config file. Usually called console.php place into config folder. We have import our newly create folder.</p>
<p>protected/config/console.php</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="co1">//....</span>
<span class="st_h">'import'</span> <span class="sy0">=&gt;</span> <span class="kw3">array</span><span class="br0">&#40;</span>
        <span class="st_h">'application.models.*'</span><span class="sy0">,</span>
        <span class="st_h">'application.components.*'</span><span class="sy0">,</span>
        <span class="st_h">'application.workers.*'</span><span class="sy0">,</span>
<span class="br0">&#41;</span><span class="sy0">,</span>
<span class="st_h">'params'</span><span class="sy0">=&gt;</span><span class="kw3">array</span><span class="br0">&#40;</span>
    <span class="st_h">'exportDir'</span> <span class="sy0">=&gt;</span> <span class="kw3">realpath</span><span class="br0">&#40;</span><span class="kw3">dirname</span><span class="br0">&#40;</span><span class="kw4">__FILE__</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="kw4">DIRECTORY_SEPARATOR</span> <span class="sy0">.</span> <span class="st_h">'..'</span> <span class="sy0">.</span> <span class="kw4">DIRECTORY_SEPARATOR</span> <span class="sy0">.</span> <span class="st_h">'..'</span> <span class="sy0">.</span> <span class="kw4">DIRECTORY_SEPARATOR</span> <span class="sy0">.</span> <span class="st_h">'www'</span> <span class="sy0">.</span> <span class="kw4">DIRECTORY_SEPARATOR</span> <span class="sy0">.</span> <span class="st_h">'export'</span><span class="br0">&#41;</span><span class="sy0">,</span>
    <span class="st_h">'exportUrl'</span> <span class="sy0">=&gt;</span> <span class="st_h">'/export'</span><span class="sy0">,</span>
<span class="br0">&#41;</span><span class="sy0">,</span>
<span class="st_h">'components'</span><span class="sy0">=&gt;</span><span class="kw3">array</span><span class="br0">&#40;</span>
<span class="co1">//.......</span></pre></div></div></div></div></div></div></div>


<p>From now all classes from workers directory will be autoloadable.<br />
Also we defined two variables <strong>exportDir </strong> and <strong>exportUrl</strong> which will be accessable globally within our app by calling this Yii::app()->params['exportUrl'] and Yii::app()->params['exportDir'] . Please correct this path to satisfy your needs. All generated PSD previews will be stored there.</p>
<p>Lets create our worker class.<br />
Here is example code of my worker which create jpg preview from the PSD file. It uses ImageMagick.</p>
<p>/protected/workers/Psd2JpegWorker.php</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1">&nbsp;
<span class="kw2">class</span> Psd2JpegWorker <span class="kw2">extends</span> GearmanWorker <span class="br0">&#123;</span>
&nbsp;
    <span class="kw2">public</span> <span class="re0">$job</span><span class="sy0">;</span>
    <span class="kw2">private</span> <span class="re0">$dir</span><span class="sy0">;</span>
    <span class="kw2">private</span> <span class="re0">$args</span><span class="sy0">;</span>
&nbsp;
    <span class="kw2">public</span> <span class="kw2">function</span> psd2jpg<span class="br0">&#40;</span><span class="re0">$job</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">job</span> <span class="sy0">=</span> <span class="re0">$job</span><span class="sy0">;</span>
        <span class="re0">$workload</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">job</span><span class="sy0">-&gt;</span><span class="me1">workload</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw1">echo</span> <span class="st0">&quot;Received job psd2jpg: &quot;</span> <span class="sy0">.</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">job</span><span class="sy0">-&gt;</span><span class="me1">handle</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="sy0">;</span>
        <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">args</span> <span class="sy0">=</span> CJSON<span class="sy0">::</span><span class="me2">decode</span><span class="br0">&#40;</span><span class="re0">$workload</span><span class="sy0">,</span> <span class="kw4">false</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="re0">$rnd</span> <span class="sy0">=</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">args</span><span class="sy0">-&gt;</span><span class="me1">rnd</span><span class="br0">&#41;</span> ? <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">args</span><span class="sy0">-&gt;</span><span class="me1">rnd</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="sy0">;</span>
        <span class="re0">$psd</span> <span class="sy0">=</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">args</span><span class="sy0">-&gt;</span><span class="me1">psd</span><span class="br0">&#41;</span> ? <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">args</span><span class="sy0">-&gt;</span><span class="me1">psd</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="sy0">;</span>
&nbsp;
        <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="kw3">dir</span> <span class="sy0">=</span> Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">params</span><span class="br0">&#91;</span><span class="st_h">'exportDir'</span><span class="br0">&#93;</span> <span class="sy0">.</span> <span class="kw4">DIRECTORY_SEPARATOR</span> <span class="sy0">.</span> <span class="re0">$rnd</span><span class="sy0">;</span>
        <span class="kw1">echo</span> <span class="st0">&quot;trying to create directory &quot;</span> <span class="sy0">.</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="kw3">dir</span> <span class="sy0">.</span> <span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="sy0">;</span>
&nbsp;
&nbsp;
        <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">is_dir</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="kw3">dir</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="kw3">mkdir</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="kw3">dir</span><span class="sy0">,</span> <span class="nu8">0777</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="kw3">chmod</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="kw3">dir</span><span class="sy0">,</span> <span class="nu8">0777</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
            <span class="kw1">echo</span> <span class="st0">&quot;Directory created<span class="es1">\n</span>&quot;</span><span class="sy0">;</span>
            <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">convert</span><span class="br0">&#40;</span><span class="re0">$psd</span><span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="kw3">dir</span> <span class="sy0">.</span> <span class="kw4">DIRECTORY_SEPARATOR</span> <span class="sy0">.</span> <span class="st_h">'preview.jpg'</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
&nbsp;
&nbsp;
    <span class="kw2">private</span> <span class="kw2">function</span> convert<span class="br0">&#40;</span><span class="re0">$src</span><span class="sy0">,</span> <span class="re0">$target</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
        <span class="re0">$width</span> <span class="sy0">=</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">args</span><span class="sy0">-&gt;</span><span class="me1">width</span><span class="br0">&#41;</span> ? <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">args</span><span class="sy0">-&gt;</span><span class="me1">width</span> <span class="sy0">:</span> <span class="nu0">400</span><span class="sy0">;</span>
        <span class="re0">$height</span> <span class="sy0">=</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">args</span><span class="sy0">-&gt;</span><span class="me1">height</span><span class="br0">&#41;</span> ? <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">args</span><span class="sy0">-&gt;</span><span class="me1">height</span> <span class="sy0">:</span> <span class="nu0">300</span><span class="sy0">;</span>
&nbsp;
        <span class="kw1">echo</span> <span class="st0">&quot;Converting<span class="es1">\n</span>&quot;</span><span class="sy0">;</span>
        <span class="re0">$cmd</span> <span class="sy0">=</span> <span class="st0">&quot;convert &quot;</span> <span class="sy0">.</span> <span class="re0">$src</span> <span class="sy0">.</span> <span class="st0">&quot;[0] -thumbnail &quot;</span><span class="sy0">.</span><span class="re0">$width</span><span class="sy0">.</span><span class="st0">&quot;x&quot;</span><span class="sy0">.</span><span class="re0">$height</span><span class="sy0">.</span><span class="st0">&quot; &quot;</span> <span class="sy0">.</span> <span class="re0">$target</span> <span class="sy0">.</span> <span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="sy0">;</span>
        <span class="kw1">echo</span> <span class="re0">$cmd</span><span class="sy0">;</span>
        <span class="kw3">exec</span><span class="br0">&#40;</span><span class="re0">$cmd</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Method psd2jpg receive GearmanJob object, Then we get required parameters as the psd location on the server and random folder name.<br />
We create new directory. All output will be placed there.<br />
After all preparings are done we call &#171;convert&#187; command (ImageMagick) with list of arguments.<br />
Everything is quite simple.</p>
<p>Let&#8217;s create Console command which will register this worker on the job server and run worker.</p>
<p>/protected/commands/ConvertCommand.php</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">&lt;?php</span>
<span class="kw2">class</span> ConvertCommand <span class="kw2">extends</span> CConsoleCommand <span class="br0">&#123;</span>
&nbsp;
    <span class="kw2">public</span> <span class="kw2">function</span> run<span class="br0">&#40;</span><span class="re0">$args</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
        <span class="re0">$worker</span> <span class="sy0">=</span> <span class="kw2">new</span> Psd2JpegWorker<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="re0">$worker</span><span class="sy0">-&gt;</span><span class="me1">addServer</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="re0">$worker</span><span class="sy0">-&gt;</span><span class="me1">addFunction</span><span class="br0">&#40;</span><span class="st0">&quot;psd2jpg&quot;</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="re0">$worker</span><span class="sy0">,</span> <span class="st0">&quot;psd2jpg&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="kw1">while</span> <span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span class="kw1">print</span> <span class="st0">&quot;Waiting for job...<span class="es1">\n</span>&quot;</span><span class="sy0">;</span>
            <span class="re0">$ret</span> <span class="sy0">=</span> <span class="re0">$worker</span><span class="sy0">-&gt;</span><span class="me1">work</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$worker</span><span class="sy0">-&gt;</span><span class="me1">returnCode</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> GEARMAN_SUCCESS<span class="br0">&#41;</span>
                <span class="kw1">break</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
&nbsp;
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Here we registered new worker and it supports one function called &#171;psd2jpg&#187;.</p>
<p>For running console command we also have to create entire script which will instatiate new ConsoleApplication</p>
<p>/protected/dispatch.php</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">&lt;?php</span>
&nbsp;
<span class="kw1">require_once</span><span class="br0">&#40;</span><span class="kw3">dirname</span><span class="br0">&#40;</span><span class="kw4">__FILE__</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st_h">'/../framework/yii.php'</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$config</span><span class="sy0">=</span><span class="kw3">dirname</span><span class="br0">&#40;</span><span class="kw4">__FILE__</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st_h">'/config/console.php'</span><span class="sy0">;</span>
&nbsp;
 <span class="co1">// remove the following line when in production mode</span>
<span class="kw3">defined</span><span class="br0">&#40;</span><span class="st_h">'YII_DEBUG'</span><span class="br0">&#41;</span> or <span class="kw3">define</span><span class="br0">&#40;</span><span class="st_h">'YII_DEBUG'</span><span class="sy0">,</span><span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span>
 Yii<span class="sy0">::</span><span class="me2">createConsoleApplication</span><span class="br0">&#40;</span><span class="re0">$config</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">run</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>This code very similiar to standart Yii&#8217;s index.php but it runs ConsoleApplication instead of WebApplication</p>
<p>Now lets run our new worker.<br />
open console, change directory to the protected folder and run this.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="bash"><pre class="de1">php dispatch.php</pre></div></div></div></div></div></div></div>


<p>Yii lookups commands directory and you may see something like this</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="bash"><pre class="de1">php dispatch.php
Yii <span class="kw3">command</span> runner <span class="br0">&#40;</span>based on Yii v1.1.10<span class="br0">&#41;</span>
Usage: dispatch.php <span class="sy0">&lt;</span>command-name<span class="sy0">&gt;</span> <span class="br0">&#91;</span>parameters...<span class="br0">&#93;</span>
&nbsp;
The following commands are available:
 - convert</pre></div></div></div></div></div></div></div>


<p>You have one command available &#8212; everything is ok. Run it!</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="bash"><pre class="de1">php dispatch convert</pre></div></div></div></div></div></div></div>




<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="bash"><pre class="de1">php dispatch.php convert
Waiting <span class="kw1">for</span> job...</pre></div></div></div></div></div></div></div>


<p>Our worker has been started and wait for job.<br />
Let&#8217;s give him some job.<br />
For doing this we have to use GearmanClient.</p>
<p>/protected/controllers/SiteController.php</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1">&nbsp;
   <span class="kw2">public</span> <span class="kw2">function</span> actionIndex<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
      <span class="re0">$psd</span> <span class="sy0">=</span> <span class="st0">&quot;/var/www/website/www/psds/some.psd&quot;</span><span class="sy0">;</span>
      <span class="re0">$rnd</span> <span class="sy0">=</span> <span class="kw3">md5</span><span class="br0">&#40;</span><span class="re0">$psd</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
      <span class="re0">$client</span> <span class="sy0">=</span> <span class="kw2">new</span> GearmanClient<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
      <span class="re0">$client</span><span class="sy0">-&gt;</span><span class="me1">addServer</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
      <span class="re0">$params</span> <span class="sy0">=</span> CJSON<span class="sy0">::</span><span class="me2">encode</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'psd'</span> <span class="sy0">=&gt;</span> <span class="re0">$psd</span><span class="sy0">,</span> <span class="st_h">'width'</span> <span class="sy0">=&gt;</span> <span class="nu0">400</span><span class="sy0">,</span> <span class="st_h">'height'</span> <span class="sy0">=&gt;</span> <span class="nu0">300</span><span class="sy0">,</span> <span class="st_h">'rnd'</span> <span class="sy0">=&gt;</span> <span class="re0">$rnd</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
      <span class="re0">$handle</span> <span class="sy0">=</span> <span class="re0">$client</span><span class="sy0">-&gt;</span><span class="kw1">do</span><span class="br0">&#40;</span><span class="st0">&quot;psd2jpg&quot;</span><span class="sy0">,</span> <span class="re0">$params</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
      <span class="re0">$targetUrl</span> <span class="sy0">=</span> Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">params</span><span class="br0">&#91;</span><span class="st_h">'exportUrl'</span><span class="br0">&#93;</span> <span class="sy0">.</span> <span class="kw4">DIRECTORY_SEPARATOR</span> <span class="sy0">.</span> <span class="re0">$rnd</span> <span class="sy0">.</span> <span class="kw4">DIRECTORY_SEPARATOR</span> <span class="sy0">.</span> <span class="st_h">'preview.jpg'</span><span class="sy0">;</span>
      <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">redirect</span><span class="br0">&#40;</span><span class="re0">$targetUrl</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
   <span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>After psd will be converted prowser will be redirected to resulted file.<br />
Run this action by typing %websitename&#038;/index.php?r=site/index<br />
Ensure that each requrest to this action initiate worker.<br />
Play with number of instances of workers runned (&#171;php dispatch convert &#038;&#187;, &#171;php dispatch convert &#038;&#187;, &#171;php dispatch convert &#038;&#187;)<br />
Try to change</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="re0">$client</span><span class="sy0">-&gt;</span><span class="kw1">do</span><span class="br0">&#40;</span><span class="st0">&quot;psd2jpg&quot;</span><span class="sy0">,</span> <span class="re0">$params</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>to</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="re0">$client</span><span class="sy0">-&gt;</span><span class="me1">doBackground</span><span class="br0">&#40;</span><span class="st0">&quot;psd2jpg&quot;</span><span class="sy0">,</span> <span class="re0">$params</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>Hope this article will help someone. Have fun!<br />
PS. I found <a href="http://www.yiiframework.com/extension/gearman/">this extension</a> which make work with gearman even easier.</p>
]]></content:encoded>
			<wfw:commentRss>http://tpoxa.com/2012/03/07/yii-consoleapplication-and-gearman-workers-psd-to-jpeg-conversation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fully ajax website with Yii – Part 2</title>
		<link>http://tpoxa.com/2011/04/19/fully-ajax-website-with-yii-%e2%80%93-part-2/</link>
		<comments>http://tpoxa.com/2011/04/19/fully-ajax-website-with-yii-%e2%80%93-part-2/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 12:28:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Yii]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[yii]]></category>

		<guid isPermaLink="false">http://tpoxa.com/?p=300</guid>
		<description><![CDATA[In previous post I described how to create simple full ajax web application without changing basically logic of the application. All changes was made to the layout, view and to the base classes. But as you maybe already noticed not everything works well. For example if you tried to sign-in -menu won&#8217;t be updated. In [...]]]></description>
			<content:encoded><![CDATA[<p>In previous post I described how to create simple full ajax web application without changing basically logic of the application. All changes was made to the layout, view and to the base classes.<br />
But as you maybe already noticed not everything works well. For example if you tried to sign-in -menu won&#8217;t be updated. In this short article I will show how to fix such kind of problems.<br/><br />
All data which ouputs for ajax request collecting with help of flash messages (built-in Yii functionality);<br/><br />
So basically if you wand update something on your page you have to set flash message with name <strong>updatedata</strong> wich contains an array with key value elements</p>
<p>Example   <strong>protected/controllers/SiteController.php</strong> ;  actionLoginMethod</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1">                <span class="sy0">...</span>
                <span class="co1">// collect user input data</span>
		<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$_POST</span><span class="br0">&#91;</span><span class="st_h">'LoginForm'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
		<span class="br0">&#123;</span>
			<span class="re0">$model</span><span class="sy0">-&gt;</span><span class="me1">attributes</span><span class="sy0">=</span><span class="re0">$_POST</span><span class="br0">&#91;</span><span class="st_h">'LoginForm'</span><span class="br0">&#93;</span><span class="sy0">;</span>
			<span class="co1">// validate user input and redirect to the previous page if valid</span>
                        <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$model</span><span class="sy0">-&gt;</span><span class="me1">validate</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="re0">$model</span><span class="sy0">-&gt;</span><span class="me1">login</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                               Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">setFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span>
 						<span class="st_h">'#mainmenu'</span><span class="sy0">=&gt;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">renderPartial</span><span class="br0">&#40;</span><span class="st_h">'/includes/menu'</span><span class="sy0">,</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span><span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">,</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>                   
                               <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">redirect</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">homeUrl</span><span class="br0">&#41;</span><span class="sy0">;</span>
                        <span class="br0">&#125;</span>
                <span class="sy0">...</span></pre></div></div></div></div></div></div></div>


<p>As you can see I put all mainmenu to separate file. Here is it&#8217;s content</p>
<p><strong>protected/views/includes/menu.php</strong></p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1">	<span class="kw2">&lt;?php</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">widget</span><span class="br0">&#40;</span><span class="st_h">'zii.widgets.CMenu'</span><span class="sy0">,</span><span class="kw3">array</span><span class="br0">&#40;</span>
			<span class="st_h">'items'</span><span class="sy0">=&gt;</span><span class="kw3">array</span><span class="br0">&#40;</span>
				<span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'label'</span><span class="sy0">=&gt;</span><span class="st_h">'Home'</span><span class="sy0">,</span> <span class="st_h">'url'</span><span class="sy0">=&gt;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'/site/index'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">,</span>
				<span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'label'</span><span class="sy0">=&gt;</span><span class="st_h">'About'</span><span class="sy0">,</span> <span class="st_h">'url'</span><span class="sy0">=&gt;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'/site/page'</span><span class="sy0">,</span> <span class="st_h">'view'</span><span class="sy0">=&gt;</span><span class="st_h">'about'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">,</span>
				<span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'label'</span><span class="sy0">=&gt;</span><span class="st_h">'Contact'</span><span class="sy0">,</span> <span class="st_h">'url'</span><span class="sy0">=&gt;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'/site/contact'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">,</span>
				<span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'label'</span><span class="sy0">=&gt;</span><span class="st_h">'Login'</span><span class="sy0">,</span> <span class="st_h">'url'</span><span class="sy0">=&gt;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'/site/login'</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st_h">'visible'</span><span class="sy0">=&gt;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">isGuest</span><span class="br0">&#41;</span><span class="sy0">,</span>
				<span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'label'</span><span class="sy0">=&gt;</span><span class="st_h">'Logout ('</span><span class="sy0">.</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">name</span><span class="sy0">.</span><span class="st_h">')'</span><span class="sy0">,</span> <span class="st_h">'url'</span><span class="sy0">=&gt;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'/site/logout'</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st_h">'visible'</span><span class="sy0">=&gt;!</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">isGuest</span><span class="br0">&#41;</span>
			<span class="br0">&#41;</span><span class="sy0">,</span>
		<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></pre></div></div></div></div></div></div></div>


<p>For avoiding dublicating data I cut this code from main layout and put there <strong>renderPartial</strong> instead.</p>
<p><strong>protected/views/layout/main.php</strong></p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="html"><pre class="de1">...
&lt;div id=&quot;mainmenu&quot; &gt;
		&lt;?php $this-&gt;renderPartial('/includes/menu');?&gt;
&lt;/div&gt;&lt;!-- mainmenu --&gt;
...</pre></div></div></div></div></div></div></div>


<p>So all blocks that might be updated via ajax better to move to includes folder. Now after sign -in main menu is changing.<br/></p>
<p>Now we have to add the same code to sign-out method</p>
<p><strong>protected/controllers/SiteController.php</strong></p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="sy0">...</span>
<span class="kw2">public</span> <span class="kw2">function</span> actionLogout<span class="br0">&#40;</span><span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">logout</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">setFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span>
 						<span class="st_h">'#mainmenu'</span><span class="sy0">=&gt;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">renderPartial</span><span class="br0">&#40;</span><span class="st_h">'/includes/menu'</span><span class="sy0">,</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span><span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">,</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">redirect</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">homeUrl</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
<span class="sy0">...</span></pre></div></div></div></div></div></div></div>


<p>
In that way you can update everyrhing you want on the webpage. Good luck!<br/>P.S. Suggestions are welcome!<br/> </p>
<p><a href="http://filin.impressweb.org" target="_blank"></p>
<h3>
Full ajax Yii webapp demo<br />
</h3>
<p></a></p>
]]></content:encoded>
			<wfw:commentRss>http://tpoxa.com/2011/04/19/fully-ajax-website-with-yii-%e2%80%93-part-2/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Fully ajax website with Yii &#8212; Part 1</title>
		<link>http://tpoxa.com/2011/04/19/fully-ajax-website-with-yii/</link>
		<comments>http://tpoxa.com/2011/04/19/fully-ajax-website-with-yii/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 11:07:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Yii]]></category>
		<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[yii]]></category>

		<guid isPermaLink="false">http://tpoxa.com/?p=264</guid>
		<description><![CDATA[This article will be suitable for who made fully ajax site like  Gmail with best PHP Framework &#8212; Yii. Main requirements are: All pages should be loaded via ajax. All forms should be submitted via ajax. Pages should be reachable by search engines. History support. Window title support Minimal additional code. Here  is my solution. [...]]]></description>
			<content:encoded><![CDATA[<p>This article will be suitable for who made fully ajax site like  Gmail with best <a href="http://www.yiiframework.com/" target="_blank">PHP Framework &#8212; Yii.</a><br />
Main requirements are:</p>
<ol>
<li>All pages should be loaded via ajax.</li>
<li>All forms should be submitted via ajax.</li>
<li>Pages should be reachable by search engines.</li>
<li>History support.</li>
<li>Window title support</li>
<li>Minimal additional code.</li>
</ol>
<p>Here  is my solution.<br />
I get for example simple web application which you can made with help of <a title="Quick start first app" href="http://www.yiiframework.com/doc/guide/1.0/en/quickstart.first-app" target="_blank">yiic utility</a>.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="shell"><pre class="de1">cd /home/www/mywebsite
wget http://yii.googlecode.com/files/yii-1.1.7.r3135.tar.gz
gunzip yii-1.1.7.r3135.tar.gz
tar -xvf yii-1.1.7.r3135.tar
mv yii-1.1.7.r3135/framework/ ./
php framework/yiic.php webapp ./</pre></div></div></div></div></div></div></div>


<p>That is it your application has been created!</p>
<p>Add this code to the <strong>protected/views/layout/main.php</strong> file  before   &lt;/head&gt; tag.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1">&nbsp;
<span class="kw2">&lt;?php</span> 
		<span class="re0">$cs</span> <span class="sy0">=</span> Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">getClientScript</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  		<span class="re0">$cs</span><span class="sy0">-&gt;</span><span class="me1">registerCoreScript</span><span class="br0">&#40;</span><span class="st_h">'jquery'</span><span class="br0">&#41;</span><span class="sy0">;</span>
  		<span class="re0">$cs</span><span class="sy0">-&gt;</span><span class="me1">registerCoreScript</span><span class="br0">&#40;</span><span class="st_h">'bbq'</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="sy1">?&gt;</span>
&nbsp;
  	<span class="kw2">&lt;?php</span> 
<span class="re0">$script</span><span class="sy0">=</span><span class="co3">&lt;&lt;&lt;HTML
			function applychanges(obj) {
					for(k in obj) {
						jQuery(k).html(obj[k]);
					}	
			}
HTML</span><span class="sy0">;</span>
<span class="re0">$cs</span><span class="sy0">-&gt;</span><span class="me1">registerScript</span><span class="br0">&#40;</span><span class="st_h">'applychanges'</span><span class="sy0">,</span> <span class="re0">$script</span><span class="sy0">,</span> CClientScript<span class="sy0">::</span><span class="me2">POS_HEAD</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="sy1">?&gt;</span>	
&nbsp;
  	<span class="kw2">&lt;?php</span> 
<span class="re0">$script</span><span class="sy0">=</span><span class="co3">&lt;&lt;&lt;HTML
		var headline = $(&quot;#loading&quot;);
&nbsp;
		$(document).ajaxSend(function() {
    		headline
        	.attr(&quot;class&quot;, &quot;activity&quot;)
		});
&nbsp;
		$(document).ajaxStop(function() {
    		headline.removeAttr(&quot;class&quot;)
		 	});
HTML</span><span class="sy0">;</span>
<span class="re0">$cs</span><span class="sy0">-&gt;</span><span class="me1">registerScript</span><span class="br0">&#40;</span><span class="st_h">'loading-indicator'</span><span class="sy0">,</span> <span class="re0">$script</span><span class="sy0">,</span> CClientScript<span class="sy0">::</span><span class="me2">POS_READY</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="sy1">?&gt;</span>
&nbsp;
&nbsp;
&nbsp;
<span class="kw2">&lt;?php</span> 
<span class="re0">$script</span><span class="sy0">=</span><span class="co3">&lt;&lt;&lt;HTML
&nbsp;
  // handling links and forms
&nbsp;
  $(&quot;a:not(.direct)&quot;).live(&quot;click&quot;, function(){		  	
		    var href = $(this).attr( &quot;href&quot; );		    
		    if(href==&quot;#&quot;)
		    	return false;	
&nbsp;
		    $.bbq.pushState({ url: href});  
		    return false;
		  });
&nbsp;
&nbsp;
&nbsp;
		  $(&quot;form:not(.direct)&quot;).live(&quot;submit&quot;, function(){
		  	var url = &quot;&quot;;
&nbsp;
			var type = jQuery(this).attr(&quot;method&quot;);
&nbsp;
			if(type==undefined)
		  		type = &quot;get&quot;;
&nbsp;
		  	if(type==&quot;get&quot;) {
&nbsp;
		  		var action = jQuery(this).attr(&quot;action&quot;);
		  		if(action.indexOf(&quot;?&quot;)==-1)
		  			url = action + &quot;?&quot; + jQuery(this).serialize();
		  		else 
		  			url = action + &quot;&amp;&quot;	+ jQuery(this).serialize();
&nbsp;
		  		$.bbq.pushState({ url: url});
&nbsp;
		  	} else {
		  		jQuery.ajax({
					type:&quot;post&quot;,
					data:$(this).serialize(),
					url:jQuery(this).attr(&quot;action&quot;),
						success:applychanges
					});
				}	
&nbsp;
&nbsp;
		  	return false;
		  })
&nbsp;
&nbsp;
		   $(window).bind( &quot;hashchange&quot;, function(e) {	    
    		var url = $.bbq.getState( &quot;url&quot; );    		
&nbsp;
    		if(!url)
    			return;
&nbsp;
		    $(&quot;a&quot;).each(function(){
		      var href = $(this).attr( &quot;href&quot; );
&nbsp;
		      if ( href === url ) {
		      	$(this).addClass( &quot;current&quot; ); $(this).parent(&quot;li&quot;).addClass( &quot;active&quot; );
&nbsp;
		      } else {
		        $(this).removeClass( &quot;current&quot; ); $(this).parent(&quot;li&quot;).removeClass( &quot;active&quot; );
		      }
		    });
&nbsp;
				jQuery.ajax({
					type:&quot;get&quot;,
					url:url,
					success:applychanges
				});
&nbsp;
		  });
&nbsp;
		  $(window).trigger( &quot;hashchange&quot; );
&nbsp;
HTML</span><span class="sy0">;</span>
<span class="re0">$cs</span><span class="sy0">-&gt;</span><span class="me1">registerScript</span><span class="br0">&#40;</span><span class="st_h">'ajaxlinks-and-forms'</span><span class="sy0">,</span> <span class="re0">$script</span><span class="sy0">,</span> CClientScript<span class="sy0">::</span><span class="me2">POS_READY</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="sy1">?&gt;</span></pre></div></div></div></div></div></div></div>


<p>Next code should be added after &lt;body&gt; tag</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="html"><pre class="de1">&lt;div id=&quot;loading&quot;&gt;&lt;?php echo Yii::t('main','Loading');?&gt;&lt;/div&gt;</pre></div></div></div></div></div></div></div>


<p>We&#8217;ve jus added javascript code which will handle all client side job<br/> Then we extend Base controller class &#171;Controller&#187;.</p>
<p><strong>protected/componens/Controller.php</strong>; Add new methods below:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">public</span> <span class="kw2">function</span> ajaxRender<span class="br0">&#40;</span><span class="re0">$file</span><span class="sy0">,</span> <span class="re0">$data</span><span class="sy0">=</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
		<span class="re0">$data</span><span class="br0">&#91;</span><span class="st_h">'title'</span><span class="br0">&#93;</span> <span class="sy0">=</span> CHtml<span class="sy0">::</span><span class="me2">encode</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">pageTitle</span><span class="br0">&#41;</span><span class="sy0">;</span>			
		<span class="kw3">header</span><span class="br0">&#40;</span><span class="st_h">'Content-type: text/x-json'</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="kw1">echo</span> CJSON<span class="sy0">::</span><span class="me2">encode</span><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#41;</span><span class="sy0">;</span>
		Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="kw3">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw2">public</span> <span class="kw2">function</span> render<span class="br0">&#40;</span><span class="re0">$file</span><span class="sy0">,</span> <span class="re0">$params</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="re0">$data</span><span class="sy0">=</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
		<span class="kw1">if</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">request</span><span class="sy0">-&gt;</span><span class="me1">isAjaxRequest</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
			<span class="kw1">if</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">hasFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
				<span class="re0">$flashdata</span> <span class="sy0">=</span> Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">getFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="br0">&#41;</span><span class="sy0">;</span>		
				<span class="re0">$data</span> <span class="sy0">=</span> <span class="re0">$data</span> <span class="sy0">+</span> <span class="re0">$flashdata</span><span class="sy0">;</span>	
			<span class="br0">&#125;</span>
&nbsp;
&nbsp;
			<span class="re0">$data</span><span class="br0">&#91;</span><span class="st_h">'#content'</span><span class="br0">&#93;</span> <span class="sy0">=</span> parent<span class="sy0">::</span><span class="me2">renderPartial</span><span class="br0">&#40;</span><span class="re0">$file</span><span class="sy0">,</span> <span class="re0">$params</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="re0">$data</span><span class="br0">&#91;</span><span class="st_h">'title'</span><span class="br0">&#93;</span> <span class="sy0">=</span> CHtml<span class="sy0">::</span><span class="me2">encode</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">pageTitle</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="kw3">header</span><span class="br0">&#40;</span><span class="st_h">'Content-type: text/x-json'</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="kw1">echo</span> CJSON<span class="sy0">::</span><span class="me2">encode</span><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#41;</span><span class="sy0">;</span>
			Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="kw3">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>			
			<span class="kw1">echo</span> parent<span class="sy0">::</span><span class="me2">render</span><span class="br0">&#40;</span><span class="re0">$file</span><span class="sy0">,</span> <span class="re0">$params</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span>	
		<span class="br0">&#125;</span>	
&nbsp;
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw2">public</span> <span class="kw2">function</span> redirect<span class="br0">&#40;</span><span class="re0">$url</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
		<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">is_array</span><span class="br0">&#40;</span><span class="re0">$url</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$url</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
			<span class="re0">$url</span> <span class="sy0">=</span> <span class="re0">$url</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw1">if</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">request</span><span class="sy0">-&gt;</span><span class="me1">isAjaxRequest</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
			<span class="re0">$data</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="kw1">if</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">hasFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
				<span class="re0">$flashdata</span> <span class="sy0">=</span> Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">getFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="br0">&#41;</span><span class="sy0">;</span>		
				<span class="re0">$data</span> <span class="sy0">=</span> <span class="re0">$data</span> <span class="sy0">+</span> <span class="re0">$flashdata</span><span class="sy0">;</span>	
			<span class="br0">&#125;</span>
&nbsp;
			<span class="re0">$data</span><span class="br0">&#91;</span><span class="st_h">'#content'</span><span class="br0">&#93;</span><span class="sy0">=</span> <span class="st_h">'&lt;script type=&quot;text/javascript&quot;&gt;
&nbsp;
				jQuery.ajax({
					url:&quot;'</span><span class="sy0">.</span><span class="re0">$url</span><span class="sy0">.</span><span class="st_h">'&quot;,
					type:&quot;get&quot;,
					success:applychanges
				});
&nbsp;
			&lt;/script&gt;'</span><span class="sy0">;</span>
&nbsp;
&nbsp;
&nbsp;
			<span class="kw3">header</span><span class="br0">&#40;</span><span class="st_h">'Content-type: text/x-json'</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="kw1">echo</span> CJSON<span class="sy0">::</span><span class="me2">encode</span><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#41;</span><span class="sy0">;</span>
			Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="kw3">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
			parent<span class="sy0">::</span><span class="me2">redirect</span><span class="br0">&#40;</span><span class="re0">$url</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw2">public</span> <span class="kw2">function</span> refresh<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="kw1">if</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">request</span><span class="sy0">-&gt;</span><span class="me1">isAjaxRequest</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
			<span class="re0">$data</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="kw1">if</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">hasFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
				<span class="re0">$flashdata</span> <span class="sy0">=</span> Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">getFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="br0">&#41;</span><span class="sy0">;</span>		
				<span class="re0">$data</span> <span class="sy0">=</span> <span class="re0">$data</span> <span class="sy0">+</span> <span class="re0">$flashdata</span><span class="sy0">;</span>	
			<span class="br0">&#125;</span>
&nbsp;
&nbsp;
			<span class="re0">$data</span><span class="br0">&#91;</span><span class="st_h">'#content'</span><span class="br0">&#93;</span><span class="sy0">=</span> <span class="st_h">'&lt;script type=&quot;text/javascript&quot;&gt;
			var url = $.bbq.getState( &quot;url&quot; );
&nbsp;
			jQuery.ajax({
					url:url,
					type:&quot;get&quot;,
					success:applychanges
				});
&nbsp;
			&lt;/script&gt;'</span><span class="sy0">;</span>
&nbsp;
			<span class="kw3">header</span><span class="br0">&#40;</span><span class="st_h">'Content-type: text/x-json'</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="kw1">echo</span> CJSON<span class="sy0">::</span><span class="me2">encode</span><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#41;</span><span class="sy0">;</span>
			Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="kw3">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
			parent<span class="sy0">::</span><span class="me2">refresh</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p> Then you have to override some Request methods to support CWebUser redirects:</p>
<p>Put content below to new file with name <strong>protected/components/EHttpRequest.php</strong></p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">&lt;?php</span> 
&nbsp;
<span class="kw2">class</span> EHttpRequest <span class="kw2">extends</span> CHttpRequest
<span class="br0">&#123;</span>
&nbsp;
	<span class="kw2">public</span> <span class="kw2">function</span> redirect<span class="br0">&#40;</span><span class="re0">$url</span><span class="sy0">,</span><span class="re0">$terminate</span><span class="sy0">=</span><span class="kw4">true</span><span class="sy0">,</span><span class="re0">$statusCode</span><span class="sy0">=</span><span class="nu0">302</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">is_array</span><span class="br0">&#40;</span><span class="re0">$url</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$url</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
			<span class="re0">$url</span> <span class="sy0">=</span> <span class="re0">$url</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw1">if</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">request</span><span class="sy0">-&gt;</span><span class="me1">isAjaxRequest</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
			<span class="re0">$data</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="kw1">if</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">hasFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
				<span class="re0">$flashdata</span> <span class="sy0">=</span> Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">getFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="br0">&#41;</span><span class="sy0">;</span>		
				<span class="re0">$data</span> <span class="sy0">=</span> <span class="re0">$data</span> <span class="sy0">+</span> <span class="re0">$flashdata</span><span class="sy0">;</span>	
			<span class="br0">&#125;</span>
&nbsp;
			<span class="re0">$data</span><span class="br0">&#91;</span><span class="st_h">'#content'</span><span class="br0">&#93;</span><span class="sy0">=</span> <span class="st_h">'&lt;script type=&quot;text/javascript&quot;&gt;
&nbsp;
				jQuery.ajax({
					url:&quot;'</span><span class="sy0">.</span><span class="re0">$url</span><span class="sy0">.</span><span class="st_h">'&quot;,
					type:&quot;get&quot;,
					success:applychanges
				});
&nbsp;
			&lt;/script&gt;'</span><span class="sy0">;</span>
&nbsp;
			<span class="kw3">header</span><span class="br0">&#40;</span><span class="st_h">'Content-type: text/x-json'</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="kw1">echo</span> CJSON<span class="sy0">::</span><span class="me2">encode</span><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="kw3">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>	
		<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
			parent<span class="sy0">::</span><span class="me2">redirect</span><span class="br0">&#40;</span><span class="re0">$url</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw2">public</span> <span class="kw2">function</span> refresh<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="kw1">if</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">request</span><span class="sy0">-&gt;</span><span class="me1">isAjaxRequest</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
			<span class="re0">$data</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="kw1">if</span><span class="br0">&#40;</span>Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">hasFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
				<span class="re0">$flashdata</span> <span class="sy0">=</span> Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">-&gt;</span><span class="me1">getFlash</span><span class="br0">&#40;</span><span class="st_h">'updatedata'</span><span class="br0">&#41;</span><span class="sy0">;</span>		
				<span class="re0">$data</span> <span class="sy0">=</span> <span class="re0">$data</span> <span class="sy0">+</span> <span class="re0">$flashdata</span><span class="sy0">;</span>	
			<span class="br0">&#125;</span>
&nbsp;
&nbsp;
			<span class="re0">$data</span><span class="br0">&#91;</span><span class="st_h">'#content'</span><span class="br0">&#93;</span><span class="sy0">=</span> <span class="st_h">'&lt;script type=&quot;text/javascript&quot;&gt;
			var url = $.bbq.getState( &quot;url&quot; );
&nbsp;
			jQuery.ajax({
					url:url,
					type:&quot;get&quot;,
					success:applychanges
				});
&nbsp;
			&lt;/script&gt;'</span><span class="sy0">;</span>
&nbsp;
			<span class="kw3">header</span><span class="br0">&#40;</span><span class="st_h">'Content-type: text/x-json'</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="kw1">echo</span> CJSON<span class="sy0">::</span><span class="me2">encode</span><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
&nbsp;
			Yii<span class="sy0">::</span><span class="me2">app</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="kw3">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>	
		<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
			parent<span class="sy0">::</span><span class="me2">refresh</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p> Set new class name for request component in your main config <strong>protected/config/main.php</strong>
<p>It should looks like this</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1">  <span class="sy0">....</span> 
  <span class="st_h">'components'</span><span class="sy0">=&gt;</span><span class="kw3">array</span><span class="br0">&#40;</span>
		<span class="st_h">'user'</span><span class="sy0">=&gt;</span><span class="kw3">array</span><span class="br0">&#40;</span>
			<span class="co1">// enable cookie-based authentication</span>
			<span class="st_h">'allowAutoLogin'</span><span class="sy0">=&gt;</span><span class="kw4">true</span><span class="sy0">,</span>
		<span class="br0">&#41;</span><span class="sy0">,</span>
&nbsp;
		<span class="st_h">'request'</span><span class="sy0">=&gt;</span><span class="kw3">array</span><span class="br0">&#40;</span>
                     <span class="st_h">'class'</span><span class="sy0">=&gt;</span><span class="st_h">'EHttpRequest'</span><span class="sy0">,</span>
               <span class="br0">&#41;</span><span class="sy0">,</span>
&nbsp;
   <span class="sy0">....</span></pre></div></div></div></div></div></div></div>


<p> That&#8217;s all. Now you have full ajax simple web application.<br/><br />
Offcourse it has some limitations and issues, further I&#8217;ll extend this article.</p>
<p>P.S. I have forgotten to say about styles.<br/> Just add these lines to your css file.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="css"><pre class="de1"><span class="re0">#loading</span> <span class="br0">&#123;</span>
	<span class="kw1">position</span><span class="sy0">:</span><span class="kw2">fixed</span><span class="sy0">;</span>
	<span class="kw1">padding</span><span class="sy0">:</span><span class="re3">3px</span><span class="sy0">;</span>
	<span class="kw1">background</span><span class="sy0">:</span><span class="re0">#80B646</span><span class="sy0">;</span>
	<span class="kw1">color</span><span class="sy0">:</span><span class="re0">#fff</span><span class="sy0">;</span>
	<span class="kw1">display</span><span class="sy0">:</span><span class="kw2">none</span><span class="sy0">;</span>
	<span class="kw1">z-index</span><span class="sy0">:</span><span class="nu0">999</span><span class="sy0">;</span>
	<span class="kw1">right</span><span class="sy0">:</span><span class="nu0">0</span><span class="sy0">;</span>
	<span class="kw1">top</span><span class="sy0">:</span><span class="nu0">0</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
<span class="re0">#loading</span><span class="re1">.activity</span> <span class="br0">&#123;</span>
	<span class="kw1">display</span><span class="sy0">:</span><span class="kw2">block</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


]]></content:encoded>
			<wfw:commentRss>http://tpoxa.com/2011/04/19/fully-ajax-website-with-yii/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Gearman воркер для скачивания файлов по URl</title>
		<link>http://tpoxa.com/2010/12/03/gearman-vorker-dlya-skachivaniya-fajlov-po-url/</link>
		<comments>http://tpoxa.com/2010/12/03/gearman-vorker-dlya-skachivaniya-fajlov-po-url/#comments</comments>
		<pubDate>Fri, 03 Dec 2010 11:13:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Yii]]></category>
		<category><![CDATA[gearman]]></category>
		<category><![CDATA[yii]]></category>

		<guid isPermaLink="false">http://tpoxa.com/?p=203</guid>
		<description><![CDATA[Gearman, сервер организации и распределения задач, более подробно можно узнать на оффициальном сайте http://gearman.org/ Данную статью я пишу для тех кто уже знает для чего он нужен и как его устанавливать.  В одном из моих проектов gearman воркеры скачивают файлы по ссылке. Также они во время работы отсылают статусы о прогрессе. Вы можете запустить нужно [...]]]></description>
			<content:encoded><![CDATA[<p>Gearman, сервер организации и распределения задач, более подробно можно узнать на оффициальном сайте http://gearman.org/</p>
<p>Данную статью я пишу для тех кто уже знает для чего он нужен и как его устанавливать.  В одном из моих проектов gearman воркеры скачивают файлы по ссылке. Также они во время работы отсылают статусы о прогрессе. Вы можете запустить нужно количество воркеров в зависимости от доступного интернет канала и конфигурации серверов.</p>
<p>Собственно сам класс воркера</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">&lt;?php</span> 
&nbsp;
<span class="kw2">class</span> FetchWorker <span class="kw2">extends</span> GearmanWorker <span class="br0">&#123;</span>
&nbsp;
	<span class="kw2">public</span> <span class="re0">$job</span><span class="sy0">;</span>
	<span class="kw2">public</span> <span class="re0">$downloaded</span><span class="sy0">;</span>
	<span class="kw2">public</span> <span class="re0">$tmp_file_name</span><span class="sy0">;</span>
	<span class="kw2">public</span> <span class="re0">$tmp_file_pointer</span><span class="sy0">;</span>
	<span class="kw2">public</span> <span class="re0">$download_size</span><span class="sy0">;</span>
	<span class="kw2">public</span> <span class="re0">$username</span><span class="sy0">;</span>
	<span class="kw2">public</span> <span class="re0">$pswd</span><span class="sy0">;</span>
	<span class="kw2">public</span> <span class="re0">$url</span><span class="sy0">;</span>
	<span class="kw2">public</span> <span class="re0">$referrer</span><span class="sy0">;</span>
	<span class="kw2">public</span> <span class="re0">$last_part_time</span><span class="sy0">;</span>
&nbsp;
&nbsp;
	<span class="kw2">private</span> <span class="kw2">function</span> resetvalues<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">download_size</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">downloaded</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">username</span> <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">pswd</span> <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">referrer</span> <span class="sy0">=</span> <span class="st_h">''</span><span class="sy0">;</span>
&nbsp;
	<span class="br0">&#125;</span>
	<span class="kw2">private</span> <span class="kw2">function</span> closefp<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="sy0">@</span><span class="kw3">fclose</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">tmp_file_pointer</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw2">private</span>	<span class="kw2">function</span> remote_filesize<span class="br0">&#40;</span><span class="br0">&#41;</span>
	<span class="br0">&#123;</span>	
		<span class="kw3">ob_start</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="re0">$ch</span> <span class="sy0">=</span> <span class="kw3">curl_init</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">url</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_HEADER<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_NOBODY<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span>
	    <span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_FOLLOWLOCATION<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span>
	    <span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_REFERER<span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">referrer</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">empty</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">username</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="sy0">!</span><span class="kw3">empty</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">pswd</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
			<span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_USERPWD<span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">username</span><span class="sy0">.</span><span class="st_h">':'</span><span class="sy0">.</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">pswd</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="re0">$ok</span> <span class="sy0">=</span> <span class="kw3">curl_exec</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw3">curl_close</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="re0">$head</span> <span class="sy0">=</span> <span class="kw3">ob_get_contents</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="kw3">ob_end_clean</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="re0">$regex</span> <span class="sy0">=</span> <span class="st_h">'/Content-Length:\s([0-9].+?)\s/'</span><span class="sy0">;</span>
		<span class="re0">$count</span> <span class="sy0">=</span> <span class="kw3">preg_match</span><span class="br0">&#40;</span><span class="re0">$regex</span><span class="sy0">,</span> <span class="re0">$head</span><span class="sy0">,</span> <span class="re0">$matches</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw1">return</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$matches</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re0">$matches</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
&nbsp;
	<span class="kw2">function</span> fetchfile<span class="br0">&#40;</span><span class="re0">$job</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">resetvalues</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">job</span> <span class="sy0">=</span> <span class="re0">$job</span><span class="sy0">;</span>
		<span class="re0">$workload</span><span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">job</span><span class="sy0">-&gt;</span><span class="me1">workload</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw1">echo</span> <span class="st0">&quot;Received job: &quot;</span> <span class="sy0">.</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">job</span><span class="sy0">-&gt;</span><span class="me1">handle</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="sy0">;</span>
&nbsp;
		<span class="re0">$args</span> <span class="sy0">=</span> <span class="kw3">json_decode</span><span class="br0">&#40;</span><span class="re0">$workload</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$args</span><span class="sy0">-&gt;</span><span class="me1">url</span><span class="br0">&#41;</span> <span class="sy0">||</span> <span class="sy0">!</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$args</span><span class="sy0">-&gt;</span><span class="me1">tmp_file</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
			<span class="kw1">print</span> <span class="st0">&quot;Url and tmp_file are required&quot;</span><span class="sy0">;</span>
			<span class="kw1">return</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">url</span> <span class="sy0">=</span> <span class="re0">$args</span><span class="sy0">-&gt;</span><span class="me1">url</span><span class="sy0">;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">pswd</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$args</span><span class="sy0">-&gt;</span><span class="me1">password</span><span class="br0">&#41;</span><span class="br0">&#41;</span>? <span class="re0">$args</span><span class="sy0">-&gt;</span><span class="me1">password</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="sy0">;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">username</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$args</span><span class="sy0">-&gt;</span><span class="me1">username</span><span class="br0">&#41;</span><span class="br0">&#41;</span>? <span class="re0">$args</span><span class="sy0">-&gt;</span><span class="me1">username</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="sy0">;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">referrer</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$args</span><span class="sy0">-&gt;</span><span class="me1">referrer</span><span class="br0">&#41;</span><span class="br0">&#41;</span> ? <span class="re0">$args</span><span class="sy0">-&gt;</span><span class="me1">referrer</span> <span class="sy0">:</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">url</span><span class="sy0">;</span>
&nbsp;
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">download_size</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">remote_filesize</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">download_size</span><span class="sy0">==</span><span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
			<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">resetvalues</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="kw1">print</span> <span class="st0">&quot;Can't get size header of the remote file&quot;</span><span class="sy0">;</span>
			<span class="kw1">return</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">tmp_file_name</span> <span class="sy0">=</span> <span class="re0">$args</span><span class="sy0">-&gt;</span><span class="me1">tmp_file</span><span class="sy0">;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">tmp_file_pointer</span> <span class="sy0">=</span> <span class="kw3">fopen</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">tmp_file_name</span><span class="sy0">,</span> <span class="st0">&quot;wb&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">tmp_file_pointer</span><span class="br0">&#41;</span>
			<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">fetchurl</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="kw1">else</span> <span class="br0">&#123;</span>
				<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">resetvalues</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
				<span class="kw1">print</span><span class="br0">&#40;</span><span class="st0">&quot;Couldn't open tmp file&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
				<span class="kw1">return</span><span class="sy0">;</span>
			 <span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw2">function</span> percent<span class="br0">&#40;</span><span class="re0">$num_amount</span><span class="sy0">,</span> <span class="re0">$num_total</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="re0">$count1</span> <span class="sy0">=</span> <span class="re0">$num_amount</span> <span class="sy0">/</span> <span class="re0">$num_total</span><span class="sy0">;</span>
		<span class="re0">$count2</span> <span class="sy0">=</span> <span class="re0">$count1</span> <span class="sy0">*</span> <span class="nu0">100</span><span class="sy0">;</span>
		<span class="re0">$count</span> <span class="sy0">=</span> <span class="kw3">ceil</span><span class="br0">&#40;</span><span class="re0">$count2</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="kw1">return</span> <span class="re0">$count</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw2">function</span> fetchurl<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
		<span class="re0">$ch</span> <span class="sy0">=</span> <span class="kw3">curl_init</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">url</span><span class="br0">&#41;</span><span class="sy0">;</span>	
		<span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_NOPROGRESS<span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_WRITEFUNCTION<span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">,</span> <span class="st_h">'fetchcallback'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_REFERER<span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">referrer</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_FOLLOWLOCATION<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">empty</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">username</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="sy0">!</span><span class="kw3">empty</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">pswd</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
			<span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_USERPWD<span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">username</span><span class="sy0">.</span><span class="st_h">':'</span><span class="sy0">.</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">pswd</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_HEADERFUNCTION<span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">,</span> <span class="st_h">'readHeader'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="kw3">curl_exec</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="kw3">curl_close</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw2">function</span> readHeader<span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> <span class="re0">$headers_text</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="kw1">return</span> <span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re0">$headers_text</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw2">function</span> fetchcallback<span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> <span class="re0">$str</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
			<span class="re0">$length</span> <span class="sy0">=</span>  <span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re0">$str</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">downloaded</span> <span class="sy0">+=</span><span class="re0">$length</span><span class="sy0">;</span>
			<span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">tmp_file_pointer</span><span class="sy0">,</span><span class="re0">$str</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
				<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">resetvalues</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
				<span class="kw1">print</span> <span class="st0">&quot;Can't write to tmp file<span class="es1">\n</span>&quot;</span><span class="sy0">;</span>
				<span class="kw1">return</span><span class="sy0">;</span>
			<span class="br0">&#125;</span> 
&nbsp;
			<span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">downloaded</span> <span class="sy0">&gt;=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">download_size</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
				 <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">resetvalues</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
				 <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">job</span><span class="sy0">-&gt;</span><span class="me1">sendStatus</span><span class="br0">&#40;</span><span class="nu0">100</span><span class="sy0">,</span><span class="nu0">100</span><span class="br0">&#41;</span><span class="sy0">;</span>
				 <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">job</span><span class="sy0">-&gt;</span><span class="me1">sendComplete</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
				 <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">closefp</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>			
				 <span class="kw1">print</span> <span class="st0">&quot;100% Done<span class="es1">\n</span>&quot;</span><span class="sy0">;</span>	
				 <span class="kw1">return</span><span class="sy0">;</span>
			<span class="br0">&#125;</span>		
&nbsp;
			<span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">last_part_time</span> <span class="sy0">&gt;</span> <span class="kw3">time</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-</span> <span class="nu0">2</span><span class="br0">&#41;</span> <span class="co1">// 2 seconds</span>
			<span class="kw1">return</span> <span class="re0">$length</span><span class="sy0">;</span>
&nbsp;
			<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">last_part_time</span> <span class="sy0">=</span> <span class="kw3">time</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">job</span><span class="sy0">-&gt;</span><span class="me1">sendStatus</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">percent</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">downloaded</span><span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">download_size</span><span class="br0">&#41;</span> <span class="sy0">,</span><span class="nu0">100</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
			<span class="kw1">print</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">percent</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">downloaded</span><span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">download_size</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st0">&quot;%...&quot;</span><span class="sy0">;</span>
			<span class="kw1">return</span> <span class="re0">$length</span><span class="sy0">;</span>	
	<span class="br0">&#125;</span>
&nbsp;
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Как видите для скачивания используется curl.<br />
Далее прилагаю код демона, который поднимает вышеуказанный класс. У меня это реализовано как консольная комманда Yii фреймворка, но вы можете реализовать демон как угодно.</p>
<p>Версия с использованием Yii</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">&lt;?php</span> 
<span class="co1">//FetchCommand.php |  placed in commands folder of Yii protected dir</span>
<span class="kw2">class</span> FetchCommand <span class="kw2">extends</span> CConsoleCommand
<span class="br0">&#123;</span>
	<span class="kw2">public</span> <span class="kw2">function</span> run<span class="br0">&#40;</span><span class="re0">$args</span><span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
&nbsp;
		<span class="re0">$worker</span> <span class="sy0">=</span> <span class="kw2">new</span> FetchWorker<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="re0">$worker</span><span class="sy0">-&gt;</span><span class="me1">addServer</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> 
		<span class="re0">$worker</span><span class="sy0">-&gt;</span><span class="me1">addFunction</span><span class="br0">&#40;</span><span class="st0">&quot;fetchfile&quot;</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="re0">$worker</span><span class="sy0">,</span> <span class="st0">&quot;fetchfile&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> 
&nbsp;
&nbsp;
		<span class="kw1">while</span> <span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>
		<span class="br0">&#123;</span>
		  <span class="kw1">print</span> <span class="st0">&quot;Waiting for job...<span class="es1">\n</span>&quot;</span><span class="sy0">;</span>
&nbsp;
		  <span class="re0">$ret</span><span class="sy0">=</span> <span class="re0">$worker</span><span class="sy0">-&gt;</span><span class="me1">work</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		  <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$worker</span><span class="sy0">-&gt;</span><span class="me1">returnCode</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> GEARMAN_SUCCESS<span class="br0">&#41;</span>
		    <span class="kw1">break</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
	<span class="br0">&#125;</span>
&nbsp;
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Standalone версия</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1">&nbsp;
<span class="kw2">&lt;?php</span> 
<span class="co1">//worker.php</span>
&nbsp;
		<span class="re0">$worker</span> <span class="sy0">=</span> <span class="kw2">new</span> FetchWorker<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="re0">$worker</span><span class="sy0">-&gt;</span><span class="me1">addServer</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> 
		<span class="re0">$worker</span><span class="sy0">-&gt;</span><span class="me1">addFunction</span><span class="br0">&#40;</span><span class="st0">&quot;fetchfile&quot;</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="re0">$worker</span><span class="sy0">,</span> <span class="st0">&quot;fetchfile&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> 
&nbsp;
&nbsp;
		<span class="kw1">while</span> <span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>
		<span class="br0">&#123;</span>
		  <span class="kw1">print</span> <span class="st0">&quot;Waiting for job...<span class="es1">\n</span>&quot;</span><span class="sy0">;</span>
&nbsp;
		  <span class="re0">$ret</span><span class="sy0">=</span> <span class="re0">$worker</span><span class="sy0">-&gt;</span><span class="me1">work</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
		  <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$worker</span><span class="sy0">-&gt;</span><span class="me1">returnCode</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> GEARMAN_SUCCESS<span class="br0">&#41;</span>
		    <span class="kw1">break</span><span class="sy0">;</span>
		<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Запуск standalone версии</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="shell"><pre class="de1">&nbsp;
php worker.php</pre></div></div></div></div></div></div></div>


<p>Запус версии с использованием Yii</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="shell"><pre class="de1">php dispatch.php Fetch</pre></div></div></div></div></div></div></div>


<p>Ну и наконец чтобы статья была исчерпывающей я приведу скрипт (точку входа) dispatch.php для Yii. В принципе он очень похож на обычный index.php  для Yii application</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw1">require_once</span><span class="br0">&#40;</span><span class="kw3">dirname</span><span class="br0">&#40;</span><span class="kw4">__FILE__</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st_h">'/framework/yii.php'</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$config</span><span class="sy0">=</span><span class="kw3">dirname</span><span class="br0">&#40;</span><span class="kw4">__FILE__</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st_h">'/protected/config/console.php'</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// remove the following line when in production mode</span>
<span class="kw3">defined</span><span class="br0">&#40;</span><span class="st_h">'YII_DEBUG'</span><span class="br0">&#41;</span> or <span class="kw3">define</span><span class="br0">&#40;</span><span class="st_h">'YII_DEBUG'</span><span class="sy0">,</span><span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
Yii<span class="sy0">::</span><span class="me2">createConsoleApplication</span><span class="br0">&#40;</span><span class="re0">$config</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">run</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>Нужно только создать отдельный конфиг для консоли. Как минимум скопируйте содержимое main config<br />
Все, будем считать что наши демоны <img src='http://tpoxa.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  запущены и ждут камманды от gearman jоb сервера чтобы начать работу.</p>
<p>Даем комманду job серверу</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">&lt;?php</span> 
<span class="co1">//index.php</span>
&nbsp;
<span class="co2"># Create our client object.
</span><span class="re0">$client</span><span class="sy0">=</span> <span class="kw2">new</span> GearmanClient<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="co2"># Add default server (localhost).
</span><span class="re0">$client</span><span class="sy0">-&gt;</span><span class="me1">addServer</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st_h">'handle'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
	<span class="re0">$handle</span> <span class="sy0">=</span> <span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st_h">'handle'</span><span class="br0">&#93;</span><span class="sy0">;</span>
	<span class="re0">$status</span> <span class="sy0">=</span> <span class="re0">$client</span><span class="sy0">-&gt;</span><span class="me1">jobStatus</span><span class="br0">&#40;</span><span class="re0">$handle</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="kw3">print_r</span><span class="br0">&#40;</span><span class="re0">$status</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="kw3">die</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="re0">$params</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span>
		<span class="st_h">'referrer'</span><span class="sy0">=&gt;</span><span class="st_h">''</span><span class="sy0">,</span>
		<span class="st_h">'tmp_file'</span><span class="sy0">=&gt;</span><span class="kw3">dirname</span><span class="br0">&#40;</span><span class="kw4">__FILE__</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st_h">'/test.file'</span><span class="sy0">,</span>
		<span class="st_h">'url'</span><span class="sy0">=&gt;</span><span class="st_h">'http://dl1.overload.in.ua/files/2050/SOD3z9jF3LiXdxO/file.zip'</span><span class="sy0">,</span>
		<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="re0">$params</span> <span class="sy0">=</span> <span class="kw3">json_encode</span><span class="br0">&#40;</span><span class="re0">$params</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$handle</span> <span class="sy0">=</span> <span class="re0">$client</span><span class="sy0">-&gt;</span><span class="me1">doBackground</span><span class="br0">&#40;</span><span class="st0">&quot;fetchfile&quot;</span><span class="sy0">,</span> <span class="re0">$params</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw3">header</span><span class="br0">&#40;</span><span class="st_h">'Location: index.php?handle='</span><span class="sy0">.</span><span class="kw3">urlencode</span><span class="br0">&#40;</span><span class="re0">$handle</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>В примере идет подключение к job серверу, дается фоновая команда с параметрами. Далее работа скрипта заканчивается и идет редирект с параметром именем задачи job-handle<br />
Далее по этому параметру скрипт может следить за прогрессом выполнения именно этого таска.</p>
<p>Конец.</p>
]]></content:encoded>
			<wfw:commentRss>http://tpoxa.com/2010/12/03/gearman-vorker-dlya-skachivaniya-fajlov-po-url/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Работа с сессиями в плагинах WordPress</title>
		<link>http://tpoxa.com/2010/10/20/using-sessions-in-wordpress-plugins/</link>
		<comments>http://tpoxa.com/2010/10/20/using-sessions-in-wordpress-plugins/#comments</comments>
		<pubDate>Wed, 20 Oct 2010 19:29:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CMS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://tpoxa.com/?p=185</guid>
		<description><![CDATA[Для разработчиков под WordPress может быть полезно. Запускаем PHP сессию из плагина &#160; function my_plugin_init&#40;&#41; &#123; if &#40;!session_id&#40;&#41;&#41; session_start&#40;&#41;; &#160; &#125; &#160; add_action&#40;'init','my_plugin_init'&#41;; После этого можно свободно пользоваться суперглобальным массивом $_SESSION]]></description>
			<content:encoded><![CDATA[<p>Для разработчиков под WordPress может быть полезно. Запускаем PHP сессию из плагина</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1">&nbsp;
<span class="kw2">function</span> my_plugin_init<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">session_id</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="kw3">session_start</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="br0">&#125;</span>
&nbsp;
add_action<span class="br0">&#40;</span><span class="st_h">'init'</span><span class="sy0">,</span><span class="st_h">'my_plugin_init'</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>После этого можно свободно пользоваться суперглобальным массивом $_SESSION</p>
]]></content:encoded>
			<wfw:commentRss>http://tpoxa.com/2010/10/20/using-sessions-in-wordpress-plugins/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Columns for CListView</title>
		<link>http://tpoxa.com/2010/08/13/columns-for-clistview/</link>
		<comments>http://tpoxa.com/2010/08/13/columns-for-clistview/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 08:11:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Yii]]></category>
		<category><![CDATA[yii]]></category>

		<guid isPermaLink="false">http://tpoxa.com/?p=148</guid>
		<description><![CDATA[В составе лучшего PHP фреймворка в мире &#8212; Yii есть класс для отображения списка элементов &#8212; CListView. К сожалению он не отображает список в несколько колонок, для одного из моих проектов понадобилось именно это. Представляю ColumnListView &#60;?php &#160; Yii::import&#40;'zii.widgets.CListView'&#41;; &#160; class ColumnListView extends CListView &#123; &#160; public $columns = array&#40;&#34;leftblock&#34;, &#34;midblock&#34;, &#34;rightblock&#34;&#41;; &#160; //@override) public [...]]]></description>
			<content:encoded><![CDATA[<p>В составе <a href="http://www.yiiframework.com/" target="_blank">лучшего PHP фреймворка в мире &#8212; Yii</a> есть класс для отображения списка элементов &#8212; CListView. К сожалению он не отображает список в несколько колонок, для одного из моих проектов понадобилось именно это.</p>
<p>Представляю ColumnListView<br />
<span id="more-148"></span></p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">&lt;?php</span> 
&nbsp;
Yii<span class="sy0">::</span><span class="me2">import</span><span class="br0">&#40;</span><span class="st_h">'zii.widgets.CListView'</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="kw2">class</span> ColumnListView <span class="kw2">extends</span> CListView
<span class="br0">&#123;</span>
&nbsp;
	<span class="kw2">public</span> <span class="re0">$columns</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&quot;leftblock&quot;</span><span class="sy0">,</span> <span class="st0">&quot;midblock&quot;</span><span class="sy0">,</span> <span class="st0">&quot;rightblock&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">//@override)</span>
	<span class="kw2">public</span> <span class="kw2">function</span> renderItems<span class="br0">&#40;</span><span class="br0">&#41;</span>
	<span class="br0">&#123;</span>
		<span class="re0">$y</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
		<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">sizeof</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">columns</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
			<span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">columns</span> <span class="kw1">as</span> <span class="re0">$column</span><span class="br0">&#41;</span>
			<span class="br0">&#123;</span>			
				<span class="kw1">echo</span> CHtml<span class="sy0">::</span><span class="me2">openTag</span><span class="br0">&#40;</span><span class="st_h">'div'</span><span class="sy0">,</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'class'</span><span class="sy0">=&gt;</span><span class="st_h">'column '</span><span class="sy0">.</span><span class="re0">$column</span><span class="sy0">,</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="sy0">;</span>
				<span class="re0">$columns</span> <span class="sy0">=</span> <span class="kw3">sizeof</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">columns</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
				<span class="re0">$data</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">dataProvider</span><span class="sy0">-&gt;</span><span class="me1">getData</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
				<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#41;</span><span class="sy0">&gt;</span><span class="nu0">0</span><span class="br0">&#41;</span>
				<span class="br0">&#123;</span>
					<span class="re0">$owner</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">getOwner</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
					<span class="re0">$render</span><span class="sy0">=</span><span class="re0">$owner</span> instanceof CController ? <span class="st_h">'renderPartial'</span> <span class="sy0">:</span> <span class="st_h">'render'</span><span class="sy0">;</span>
					<span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$data</span> <span class="kw1">as</span> <span class="re0">$i</span><span class="sy0">=&gt;</span><span class="re0">$item</span><span class="br0">&#41;</span>
					<span class="br0">&#123;</span>	
						<span class="kw1">if</span><span class="br0">&#40;</span> <span class="br0">&#40;</span><span class="re0">$i</span><span class="sy0">+</span> <span class="br0">&#40;</span><span class="re0">$columns</span> <span class="sy0">-</span> <span class="re0">$y</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">%</span> <span class="re0">$columns</span> <span class="sy0">==</span> <span class="nu0">0</span><span class="br0">&#41;</span>
						<span class="br0">&#123;</span>
							<span class="re0">$data</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">viewData</span><span class="sy0">;</span>
							<span class="re0">$data</span><span class="br0">&#91;</span><span class="st_h">'index'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$i</span><span class="sy0">;</span>
							<span class="re0">$data</span><span class="br0">&#91;</span><span class="st_h">'data'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$item</span><span class="sy0">;</span>
							<span class="re0">$data</span><span class="br0">&#91;</span><span class="st_h">'widget'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">;</span>
							<span class="re0">$owner</span><span class="sy0">-&gt;</span><span class="re0">$render</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">itemView</span><span class="sy0">,</span><span class="re0">$data</span><span class="br0">&#41;</span><span class="sy0">;</span>
						<span class="br0">&#125;</span>
					<span class="br0">&#125;</span>
				<span class="br0">&#125;</span>
				<span class="kw1">else</span>
					<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">renderEmptyText</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
				<span class="kw1">echo</span> CHtml<span class="sy0">::</span><span class="me2">closeTag</span><span class="br0">&#40;</span><span class="st_h">'div'</span><span class="br0">&#41;</span><span class="sy0">;</span>
				<span class="re0">$y</span><span class="sy0">++;</span>
			<span class="br0">&#125;</span>	
	<span class="br0">&#125;</span>
&nbsp;
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Использование:</p>
<p>Скопируйте файл ColumnListView.php в папку protected/components.</p>
<p>В том месте где нужно вывести список должен выполнится примерно такой код:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1">&nbsp;
<span class="kw2">&lt;?php</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">widget</span><span class="br0">&#40;</span><span class="st_h">'application.components.ColumnListView'</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span>
		<span class="st_h">'dataProvider'</span><span class="sy0">=&gt;</span><span class="re0">$dataProvider</span><span class="sy0">,</span>
		<span class="st_h">'itemView'</span><span class="sy0">=&gt;</span><span class="st_h">'_view'</span><span class="sy0">,</span>
		<span class="st_h">'columns'</span><span class="sy0">=&gt;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&quot;one&quot;</span><span class="sy0">,</span><span class="st0">&quot;two&quot;</span><span class="sy0">,</span><span class="st0">&quot;three&quot;</span><span class="sy0">,</span><span class="st0">&quot;four&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span>
	<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></pre></div></div></div></div></div></div></div>


<p>Все наши элементы будут выведены в четырех колонках.<br />
Обратите внимание, добавился новый параметр columns &#8212; массив, каждый элемент которого это див с одноименным классом. Правильное отображение этих дивов вам нужно обеспечить самостоятельно.</p>
<p><a href="http://overload.in.ua/1787" target="_blank">ColumnListView.php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tpoxa.com/2010/08/13/columns-for-clistview/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Видео чат своими руками на FreeBsd</title>
		<link>http://tpoxa.com/2009/01/06/videochat/</link>
		<comments>http://tpoxa.com/2009/01/06/videochat/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 22:40:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Сайты]]></category>

		<guid isPermaLink="false">http://tpoxa.com/?p=58</guid>
		<description><![CDATA[Всем привет. Однажды задался сделать видео чат. Знаний во флеш у меня маловато поэтому решил использовать готовый. В качестве сервера выбрал бесплатный флеш сервер RED5  (http://osflash.org/red5) Сам видеочат взял c http://www.flashcoms.com/  Их триальный чат позволяет работать максимум с пятью  онлайнерами. В приниципе настроив  RED5 на своем сервере вы можете использовать и http://www.red5chat.com/ &#8212; он более [...]]]></description>
			<content:encoded><![CDATA[<p>Всем привет.</p>
<p>Однажды задался сделать видео чат.</p>
<p><span id="more-58"></span></p>
<p>Знаний во флеш у меня маловато поэтому решил использовать готовый.</p>
<p>В качестве сервера выбрал бесплатный флеш сервер RED5  (http://osflash.org/red5)</p>
<p>Сам видеочат взял c http://www.flashcoms.com/  Их триальный чат позволяет работать максимум с пятью  онлайнерами.</p>
<p>В приниципе настроив  RED5 на своем сервере вы можете использовать и http://www.red5chat.com/ &#8212; он более сложен в установке, функционал победнее зато бесплатен.</p>
<p>Так как RED5 &#8212; это tomcat с своими сервлетами то на сервере вам нужна JAVA.</p>
<p>Как устанавливать Java на freebsd нашел в рунете.</p>
<p>Установка red5 заключается в скачивании архива в какую либо папку и  его распокавка.</p>
<p>Запуск RED5 .</p>
<p>sh /usr/local/distfiles/red5/red5.sh</p>
<p>(/usr/local/distfiles/  -папка куда я распаковал архив с red5)</p>
<p>Установка  видеочата от flashcoms состоит из двух частей. Добавление в tomcat (папка  /usr/local/distfiles/red5/webapps)</p>
<p>сервлета который идет с flashcoms видеочатом.   (у меня это папка flashcoms_5_1_videochat)</p>
<p>после копирования вы должны перезапустить RED5</p>
<p>По сути все. Осталось разместить html и флеш файлы которые идут с видеочатом в www папке.</p>
<p><a href="http://videochat.in.ua" target="_blank">Пример работы видеочата </a></p>
<p>Будут вопросы пишите в комментариях.</p>
]]></content:encoded>
			<wfw:commentRss>http://tpoxa.com/2009/01/06/videochat/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Проблемы с кодировкой WordPress 2.7</title>
		<link>http://tpoxa.com/2008/12/20/problemi_s_kodirovkoy/</link>
		<comments>http://tpoxa.com/2008/12/20/problemi_s_kodirovkoy/#comments</comments>
		<pubDate>Sat, 20 Dec 2008 08:01:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://tpoxa.com/?p=51</guid>
		<description><![CDATA[Заметил что в некотрых случаях все AJAX ответы в админке возвращаются с неверной кодировкой. Изза этого все надписи кирилицей повреждены. Это происходит тогда когда дефолтовая кдировка www хоста отличается от кодировки установленой в wordpress. Лечится это маленьким изменением в wp-includes/admin-ajax.php Нужно подправить метод send() объекта WP_Ajax_Response, привести его к такому виду. function send&#40;&#41; &#123; header&#40;'Content-Type: [...]]]></description>
			<content:encoded><![CDATA[<p>Заметил что в некотрых случаях все AJAX ответы в админке возвращаются с неверной кодировкой. Изза этого все надписи кирилицей повреждены.</p>
<p>Это происходит тогда когда дефолтовая кдировка www хоста отличается от кодировки установленой в wordpress.</p>
<p><span id="more-51"></span>Лечится это маленьким изменением в wp-includes/admin-ajax.php</p>
<p>Нужно подправить метод send() объекта WP_Ajax_Response, привести его к такому виду.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">function</span> send<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw3">header</span><span class="br0">&#40;</span><span class="st_h">'Content-Type: text/xml; charset='</span> <span class="sy0">.</span> get_option<span class="br0">&#40;</span><span class="st_h">'blog_charset'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw1">echo</span> <span class="st0">&quot;&quot;</span><span class="sy0">;</span>
<span class="kw1">foreach</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#41;</span> <span class="re0">$this</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>responses <span class="kw1">as</span> <span class="re0">$response</span> <span class="br0">&#41;</span>
<span class="kw1">echo</span> <span class="re0">$response</span><span class="sy0">;</span>
<span class="kw1">echo</span> <span class="st_h">''</span><span class="sy0">;</span>
<span class="kw3">die</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>вот и все <img src='http://tpoxa.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://tpoxa.com/2008/12/20/problemi_s_kodirovkoy/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>market.yandex.ru парсер</title>
		<link>http://tpoxa.com/2008/09/09/marketyandexru-parser/</link>
		<comments>http://tpoxa.com/2008/09/09/marketyandexru-parser/#comments</comments>
		<pubDate>Tue, 09 Sep 2008 18:48:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[XSLT]]></category>

		<guid isPermaLink="false">http://tpoxa.com/?p=28</guid>
		<description><![CDATA[Недавно появилась задача парсить странички. Точнее market.yandex.ru. Собрать все описания в готовом к вставке в базу виде а также доступные изображения к товару. Исторически сложилось что с регулярками у меня хуже чем с XSLT. Все хорошо но маркет не дает валидный код и парсить его напрямую у меня не получилось. На помощь пришел Tidy. &#60;?php [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно появилась задача парсить странички. Точнее market.yandex.ru.</p>
<p>Собрать все описания в готовом к вставке в базу виде а также доступные изображения к товару.</p>
<p>Исторически сложилось что с регулярками у меня хуже чем с XSLT.</p>
<p>Все хорошо но маркет не дает валидный код и парсить его напрямую у меня не получилось.</p>
<p>На помощь пришел Tidy.</p>
<p><span id="more-28"></span></p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">&lt;?php</span>
&nbsp;
<span class="re0">$YMI</span><span class="sy0">=</span><span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st_h">'ymid'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> ? <span class="kw3">urldecode</span><span class="br0">&#40;</span><span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st_h">'ymid'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">:</span> <span class="st0">&quot;&quot;</span><span class="sy0">;</span> <span class="co1">// переменная хранит адрес страницы с описанием на Яндексе</span>
<span class="re0">$content</span> <span class="sy0">=</span> <span class="kw3">file_get_contents</span><span class="br0">&#40;</span><span class="re0">$YMI</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// $content = iconv(&quot;CP1251&quot;, &quot;UTF-8//IGNORE&quot;, $content); // это строка ненужна така Яндекс маркет перешел на UTF-8</span>
&nbsp;
<span class="re0">$config</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span>
<span class="st0">&quot;indent&quot;</span>        <span class="sy0">=&gt;</span> <span class="kw4">true</span><span class="sy0">,</span>
<span class="st0">&quot;output-xml&quot;</span>    <span class="sy0">=&gt;</span> <span class="kw4">true</span><span class="sy0">,</span>
<span class="st0">&quot;wrap&quot;</span>          <span class="sy0">=&gt;</span> <span class="nu0">200</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="re0">$tidy</span> <span class="sy0">=</span> <span class="kw2">new</span> tidy<span class="sy0">;</span>
<span class="re0">$tidy</span><span class="sy0">-&gt;</span><span class="me1">parseString</span><span class="br0">&#40;</span><span class="re0">$content</span><span class="sy0">,</span> <span class="re0">$config</span><span class="sy0">,</span> <span class="st0">&quot;utf8&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$tidy</span><span class="sy0">-&gt;</span><span class="me1">cleanRepair</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="re0">$xml</span><span class="sy0">=</span><span class="kw3">simplexml_load_string</span> <span class="br0">&#40;</span><span class="re0">$tidy</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="re0">$groups</span> <span class="sy0">=</span> <span class="re0">$xml</span><span class="sy0">-&gt;</span><span class="me1">xpath</span><span class="br0">&#40;</span><span class="st0">&quot;//table[@class=&quot;</span>modelProperties<span class="st0">&quot;]//tr/td[@class=&quot;</span>title<span class="st0">&quot;]/b&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$strings</span> <span class="sy0">=</span> <span class="re0">$xml</span><span class="sy0">-&gt;</span><span class="me1">xpath</span><span class="br0">&#40;</span><span class="st0">&quot;//table[@class=&quot;</span>modelProperties<span class="st0">&quot;]//tr/td[@class=&quot;</span>title<span class="st0">&quot;]/b|//table[@class=\'modelProperties\']//td[@class=\'label\']/span/text()|//table[@class=\'modelProperties\']//tr/td[position()=2]/text()&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="re0">$results_groups</span><span class="sy0">=</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$results</span><span class="sy0">=</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$i</span><span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span>
<span class="re0">$GI</span><span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span>
&nbsp;
<span class="co1">//print_r($strings);</span>
<span class="kw1">while</span><span class="br0">&#40;</span><span class="re0">$i</span><span class="sy0">&lt;</span><span class="kw3">sizeof</span> <span class="br0">&#40;</span><span class="re0">$strings</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">in_array</span><span class="br0">&#40;</span><span class="re0">$strings</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="re0">$groups</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
<span class="re0">$GI</span><span class="sy0">=</span><span class="kw3">sizeof</span><span class="br0">&#40;</span><span class="re0">$results_groups</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$results_groups</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="br0">&#40;</span>string<span class="br0">&#41;</span><span class="re0">$strings</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="sy0">;</span>
<span class="re0">$results</span><span class="br0">&#91;</span><span class="re0">$GI</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#40;</span>string<span class="br0">&#41;</span><span class="re0">$strings</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="sy0">+</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#40;</span>string<span class="br0">&#41;</span><span class="re0">$strings</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="sy0">+</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$i</span><span class="sy0">=</span><span class="re0">$i</span><span class="sy0">+</span><span class="nu0">3</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
<span class="kw1">else</span>
<span class="br0">&#123;</span>
<span class="re0">$results</span><span class="br0">&#91;</span><span class="re0">$GI</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#40;</span>string<span class="br0">&#41;</span><span class="re0">$strings</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#40;</span>string<span class="br0">&#41;</span><span class="re0">$strings</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="sy0">+</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$i</span><span class="sy0">=</span><span class="re0">$i</span><span class="sy0">+</span><span class="nu0">2</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="re0">$photos</span> <span class="sy0">=</span> <span class="re0">$xml</span><span class="sy0">-&gt;</span><span class="me1">xpath</span><span class="br0">&#40;</span><span class="st0">&quot;//table[@class=&quot;</span>modelpict<span class="st0">&quot;]//a/@href&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">empty</span><span class="br0">&#40;</span><span class="re0">$photos</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
<span class="re0">$photos</span> <span class="sy0">=</span> <span class="re0">$xml</span><span class="sy0">-&gt;</span><span class="me1">xpath</span><span class="br0">&#40;</span><span class="st0">&quot;//table[@class=&quot;</span>modelpict<span class="st0">&quot;]//img/@src&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw1">foreach</span><span class="br0">&#40;</span> <span class="re0">$photos</span> <span class="kw1">as</span> <span class="re0">$photo</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
<span class="kw1">print</span> <span class="st0">&quot;&lt;img src=<span class="es1">\&quot;</span>&quot;</span><span class="sy0">;</span>
<span class="kw1">print</span> <span class="br0">&#40;</span>string<span class="br0">&#41;</span> <span class="re0">$photo</span><span class="sy0">;</span>
<span class="kw1">print</span> <span class="st0">&quot;<span class="es1">\&quot;</span> /&gt;&quot;</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw1">print</span> <span class="st0">&quot;&lt;hr /&gt;&lt;table&gt;&lt;caption&gt;Технические характеристики&lt;/caption&gt;&quot;</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$results_groups</span> <span class="kw1">as</span> <span class="re0">$k</span><span class="sy0">=&gt;</span><span class="re0">$v</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
<span class="kw1">print</span> <span class="st0">&quot;&lt;tr&gt;&lt;td colspan=<span class="es1">\&quot;</span>2<span class="es1">\&quot;</span> align=<span class="es1">\&quot;</span>center<span class="es1">\&quot;</span> style=<span class="es1">\&quot;</span>background-color:#ccc<span class="es1">\&quot;</span>&gt;&quot;</span><span class="sy0">.</span><span class="re0">$v</span><span class="sy0">.</span><span class="st0">&quot;&lt;/td&gt;&lt;/tr&gt;&quot;</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$results</span><span class="br0">&#91;</span><span class="re0">$k</span><span class="br0">&#93;</span> <span class="kw1">as</span> <span class="re0">$arr</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
<span class="kw1">print</span> <span class="st0">&quot;&lt;tr&gt;&lt;td&gt;&quot;</span><span class="sy0">.</span><span class="re0">$arr</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot;&lt;/td&gt;&lt;td&gt;&quot;</span><span class="sy0">.</span><span class="re0">$arr</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st0">&quot;&lt;/td&gt;&lt;/tr&gt;&quot;</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
<span class="kw1">print</span> <span class="st0">&quot;&lt;/table&gt;&quot;</span><span class="sy0">;</span>
&nbsp;
<span class="sy1">?&gt;</span></pre></div></div></div></div></div></div></div>


]]></content:encoded>
			<wfw:commentRss>http://tpoxa.com/2008/09/09/marketyandexru-parser/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Downloader на PHP с поддержкой докачки.</title>
		<link>http://tpoxa.com/2008/08/29/peardownloader/</link>
		<comments>http://tpoxa.com/2008/08/29/peardownloader/#comments</comments>
		<pubDate>Fri, 29 Aug 2008 09:35:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://tpoxa.com/?p=21</guid>
		<description><![CDATA[В свое время столкнулся с проблемой когда нужно скрыть реальный URL скачиваемого файла.Обычным выходом из такой ситуации есть следующее. PHP читает содержимое файла. Выводит соответствующие заголовки файла (headers)  (имя файла, размер и тип ) и печатает содержимое на страницу. Пример &#60;?php $filename=&#34;/some_secret_folder/file.mp3&#34;; header&#40;&#34;Content-Type: audio/mpeg&#34;&#41;; header&#40;&#34;Content-Disposition: attachment; filename=&#34;.basename&#40;$filename&#41;&#41;; header&#40;&#34;Content-Length: &#34;. filesize&#40;$filename&#41;&#41;; readfile&#40;$filename&#41;; ?&#62; Где $filename путь [...]]]></description>
			<content:encoded><![CDATA[<p>В свое время столкнулся с проблемой когда нужно скрыть реальный URL скачиваемого файла.Обычным выходом из такой ситуации есть следующее.<span id="more-21"></span></p>
<p>PHP читает содержимое файла.</p>
<p>Выводит соответствующие заголовки файла (headers)  (имя файла, размер и тип )  и печатает содержимое на страницу.</p>
<p>Пример</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">&lt;?php</span>
<span class="re0">$filename</span><span class="sy0">=</span><span class="st0">&quot;/some_secret_folder/file.mp3&quot;</span><span class="sy0">;</span>
<span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Content-Type: audio/mpeg&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Content-Disposition: attachment; filename=&quot;</span><span class="sy0">.</span><span class="kw3">basename</span><span class="br0">&#40;</span><span class="re0">$filename</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Content-Length: &quot;</span><span class="sy0">.</span> <span class="kw3">filesize</span><span class="br0">&#40;</span><span class="re0">$filename</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw3">readfile</span><span class="br0">&#40;</span><span class="re0">$filename</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="sy1">?&gt;</span></pre></div></div></div></div></div></div></div>


<p>Где $filename путь к файлу. У данного способа есть несколько минусов. Один из них не поддерживается докачка. Для того чтобы  скрипт поддерживал докачку он должен отдавать кусок тела файла (header(Content-Range:xxx)) в зависимости от полученого заголовка ($_SERVER["HTTP_RANGE"]). Конечно это можно было написать самому но я решил воспользоваться готовым решением на PEAR</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="sy0">&lt;</span> ?php
<span class="re0">$filename</span><span class="sy0">=</span><span class="st0">&quot;/some_secret_folder/file.mp3&quot;</span><span class="sy0">;</span>
<span class="kw3">ini_set</span><span class="br0">&#40;</span><span class="st_h">'include_path'</span><span class="sy0">,</span> <span class="kw3">ini_get</span><span class="br0">&#40;</span><span class="st_h">'include_path'</span><span class="br0">&#41;</span><span class="sy0">.</span>PATH_SEPARATOR <span class="sy0">.</span> <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'DOCUMENT_ROOT'</span><span class="br0">&#93;</span> <span class="sy0">.</span> <span class="kw4">DIRECTORY_SEPARATOR</span> <span class="sy0">.</span> ‘pear<span class="sy0">/</span>PEAR’<span class="br0">&#41;</span><span class="sy0">;</span>
<span class="co1">// добавляем в пути инклудов папку куда установлен на сайте PEAR</span>
<span class="kw1">require</span><span class="br0">&#40;</span>”HTTP<span class="sy0">/</span>Download<span class="sy0">.</span>php”<span class="br0">&#41;</span><span class="sy0">;</span>
<span class="co1">// Подключаем  HTTP_Download</span>
<span class="re0">$dl</span> <span class="sy0">=</span> <span class="kw2">&amp;new</span> HTTP_Download<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="co1">// Создаем экземпляр класса</span>
<span class="re0">$dl</span><span class="sy0">-&gt;</span><span class="me1">setFile</span><span class="br0">&#40;</span><span class="re0">$filename</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="co1">//указываем какой файл</span>
<span class="re0">$dl</span><span class="sy0">-&gt;</span><span class="me1">setContentDisposition</span><span class="br0">&#40;</span>HTTP_DOWNLOAD_ATTACHMENT<span class="sy0">,</span> <span class="kw3">basename</span><span class="br0">&#40;</span><span class="re0">$filename</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// Устанавливаем имя с которым будет скачиваться файл</span>
<span class="re0">$dl</span><span class="sy0">-&gt;</span><span class="me1">setContentType</span><span class="br0">&#40;</span>”audio<span class="sy0">/</span>mpeg”<span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// Устанавливаем тип файла</span>
<span class="re0">$dl</span><span class="sy0">-&gt;</span><span class="me1">send</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="sy1">?&gt;</span></pre></div></div></div></div></div></div></div>


]]></content:encoded>
			<wfw:commentRss>http://tpoxa.com/2008/08/29/peardownloader/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

