Make php-fpm execute arbitrary PHP scripts via socket

October 22nd, 2011

We are using APC cache very heavily in our projects and during project deployment the cache must be flushed and warmed up. A common solution to warmup the APC cache is to fetch some special page via HTTP which does the job.

The problem with this approach is that it’s not reliable enough when PHP is served via several fastcgi back-ends. You may actually never know which back-end is going to serve your HTTP request. And I needed a solution which would warmup caches on every PHP back-end for sure.

For this reason I extracted some fastcgi related bits from the Nanoweb PHP web server and created a phpfpm module which allows to directly talk to the fastcgi via socket and execute arbitrary PHP scripts. Here’s the usage example:

<?php
include("phpfpm.inc.php");
$filename = "/path/to/project/bin/apc_warmup.php";
$response = phpfpm_request("localhost", 9000, $filename);
var_dump($response);

Note, it was tested only with php-fpm so I’m not sure if it’s going to work with anything else. The code of phpfpm.inc.php is quite “hackish” but, hey, it does its job ;)

taskman: yet another Ant alternative

October 13th, 2010

I created a small PHP library taskman for writing project related tasks in a similar with Ant and rake fashion.

There is a lib-taskman project on the google code hosting where you can find the full documentation, sources and latest releases.

It’s probably not that elegant as rake but if you want to stick to PHP and have Ant-alike functionality without any XML programming then taskman may turn out to be handy. taskman is very simple to use, it requires only one include, all its code resides in one PHP file, and it has no external dependencies.

Here is the simplest usage example.

  • Download and unpack the archive.
  • Put taskman.inc.php to some place where you can include it from(I personally tend to bundle this script with every project).
  • Create a task.php script with the following contents:
<?php
require('taskman.inc.php');
 
taskman_run($argv);
 
function task_hello()
{
  echo "Hello\n";
}
 
function task_comma()
{
  echo ",\n";
}
 
/**
 * @deps comma
 */
function task_world()
{
  echo "World\n";
}
 
/**
 * @deps hello,world
 */
function task_say($args = array())
{
  if(isset($args[0]))
    echo $args[0] . "\n";
}

You can run this script now in the command line as follows:

>php task.php say Whatever
************************ Running task 'hello' ************************
Hello
************************* 'hello' done (0 sec.)*************************
************************ Running task 'comma' ************************
,
************************* 'comma' done (0 sec.)*************************
************************ Running task 'world' ************************
World
************************* 'world' done (0 sec.)*************************
************************ Running task 'say' ************************
Whatever
************************* 'say' done (0 sec.)*************************
************************ All done (0 sec.)************************

You might be wondering what these “project related tasks” are. There can be lot of them: build the sources, bootstrap database, auto-generate code, migrate database schema, deploy project onto remote servers, etc. Maintenance of such tasks can become pretty tedious at some moment. Furthermore, some tasks may depend on other task, e.g. you can not build the sources without running code auto-generation task first.

P.S. Looks like there is a similar PHP solution called pake. The biggest difference between taskman and pake is the way tasks are specified. In case of taskman one has to prefix task functions with task_ keyword while in pake one has to register tasks explicitly using pake_task(..) function. Furthermore, in taskman one attaches task meta information using a PHPDoc block while in pake one should use separate functions, e.g. pake_desc(..).

P.P.S As David noted in comments there is also a Phake project which has, I believe, the strongest resemblance with rake thanks to new PHP-5.3 only features(e.g closures). Some of its ideas I’m going to borrow for taskman2 which will be PHP-5.3 only as well.

fla2swf - command line utility for publishing .fla files to .swf

October 4th, 2010

Continuing my flash automation saga this time I’m going to blog about a fla2swf utility, as I promised in the previous post about fcshd. You can grab it in the downloads section of the flash-automation project.

fla2swf is a command line utility written in PHP which can be used in a batch mode for publishing .fla files to .swf. It consists of the client and server parts. The cool thing behind this utility is the fact the client can be run on the box without Flash IDE installed(even on the *nix box). Of course, you will need the server to be run on the workstation with the Flash authoring environment installed.
Read the rest of this entry »

Cross-platform convenience wrapper around fcsh (for fast incremental Flex builds)

September 28th, 2010

For the impatient

fcshd is a convenient command line PHP based wrapper around fcsh shell. It works both in *nix and Windows. You can grab it from the downloads section of the flash-automation project. Just unzip it, enter the directory and run “php fcshc.php” in the shell to get the basic usage help.
Read the rest of this entry »

Making FuzzyFinder vim plugin really convenient (a-la TextMate “Go to file”)

September 24th, 2010

I really like the FuzzyFinder vim plugin. In short, it allows to search quickly for files, tags, buffers, etc using fuzzy logic.

I especially like it for its ability to find files recursively using simple patterns. However, by default FuzzyFinder is not really convenient because it searches for files relative to the current working directory in vim. And what I want is to be able to search for files recursively relative to some project’s root directory at any moment from any buffer.

Of course, it’s possible in FuzzyFinder to use “../../**”-alike patterns in order to make it search recursively starting from upper directories. But it’s quite boring. It’s especially painful for those folks(me included) who have vim settings which change the vim cwd to the one where the opened file resides.

Some folks may suggest using the Project plugin which allows to setup the global cwd for each project. But that’s too much of a hassle to my humble opinion. There should be a simpler way :)
Read the rest of this entry »

Zveriki game is now available at odnoklassniki.ru

September 6th, 2010

null The game I’m currently working on is now officially available on the Russian social service odnoklassniki.ru(quite popular in Russia and somewhat similar to linkedin). Hope our servers can handle the load :)

gcc precompiled headers weird behaviour with -c option

March 28th, 2010

Short story

Use -fpch-preprocess option alongside with -c option in order to make precompiled headers work properly.

Update: I asked the same question on the gcc help mailing list and Ian Lance Taylor explained this strange behavior by my usage of distcc/ccache. These tools first preprocess the source that’s why this options is required.

Long story

I’m using gcc-4.4.1 on Linux and before trying precompiled headers in a really large project I decided to test them on a simple program. They “kinda work” but I was not happy with results and I was sure there was something wrong about my setup.
Read the rest of this entry »

Mercurial file conflicts resolution similar to Subversion behavior

January 8th, 2010

For the impatient

Ok, here is what you have to do on your Ubuntu box:

$ sudo apt-get install rcs
$ vim ~/.hgrc

… and put the following lines somewhere into your ~/.hgrc

[merge-tools]
merge.priority = 100

Read the rest of this entry »

glibc-2.7 makecontext issues on x86_64

December 28th, 2009

Looks like passing 64 bit values(e.g pointers) into makecontext is not working properly on x86_64. We are using makecontext for coroutines implementation and its proper working is vital for us.

I’ve been struggling with this bug for a couple of days and have finally found a solution for it. Actually the solution is trivial it was the actual process of spotting this bug which took so much time. By the way, this issue was resolved in the latest releases of glibc, so nothing to worry about if you are using gcc older than 4.2.4.
Read the rest of this entry »

Redirect build errors into vim

December 10th, 2009

Here is a small bash function which wraps the executed command in the shell and redirects all build errors right into vim. In vim you can jump between errors using standard :cn,:cp commands(as well as view them all using :cope).

function vimize () 
{ 
  local file=/tmp/vimize.errors
  if [ "$1" != "" ] ; then
    rm $file 2> /dev/null
    $1 "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" 2>&1 | tee $file
  fi
  grep ': error:' $file 
  if [ "$?" == "0" ] ; then
    vim -q $file -c :copen
  fi
}

Just put it into your ~/.bashrc, reload the shell and ejoy it. It can be used as follows:

$ vimize ./run_some_build_script