Posted in Linux, PHP

After upgrading to 11.10 recently, I occasionally noticed fuser firing up and using between 70% and astoundingly 9999% CPU. Googling the issue led me to this post with the solution.

As user grazer explains:

We have the same problem. This is the content of /etc/cron.d/php5 on 11.10:

09,39 *     * * *     root   [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete

And this is the content on 11.04:

09,39 *     * * *     root   [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete

Spot the difference?

The 11.10 version runs fuser for each PHP session file, thus using all the CPU when there are hundreds of sessions.

After commenting out the 11.10 line and replacing with the 11.04 equivalent, this problem was solved for me aswell. Thanks, grazer!

You can also check out the bug report to keep up to date on this issue. Hopefully a fix will be released quickly.

Read More »

Posted (Updated ) in PHP

I had a bit of an issue with this and the documentation wasn’t of much help so I thought I’d post about the process. I currently have CampaignMonitor and MailChimp modules in the LemonStand marketplace and wanted to allow customers to create subscription forms on their sites that AJAX submit.

Firstly, here is the documentation page on custom events. The docs show that you need two things:

  • A subscribeEvents() method in your module’s setup class containing an addEvent() call.
  • A method containing the code you want to execute, which will be triggered by your event.

I attempted to do the above with the following backend code:

<?php
class MyModule_Module extends Core_ModuleBase
{
	public function subscribeEvents()
	{
		Backend::$events->addEvent('MyModule_Module:onSubmit', $this, 'on_submit');
	}

	public function onSubmit()
	{
		//...
	}
}

And frontend code:

<form onsubmit="return $(this).sendRequest('MyModule_Module:onSubmit')" action="/" method="post">
	<input type='submit' name='submit' value='Submit' />
</form>

I submitted the form and was greeted with an error message:

An AJAX error occurred: AJAX handler not found.

After a little digging I came across the function excuted when you perform an AJAX query. Important lines are highlighted:

public static function execAjaxHandler($name, $controller)
{
	$parts = explode(':', $name);
	if (count($parts) != 2)
		throw new Phpr_ApplicationException("Invalid event handler identifier: $name");

	$className = ucfirst($parts[0]).'_Actions';
	if (!Phpr::$classLoader->load($className))
		throw new Phpr_ApplicationException("Actions scope class is not found: $className");

	$method = $parts[1];
	$isEventHandler = preg_match('/^on_/', $method);
	if (!$isEventHandler)
		throw new Phpr_ApplicationException("Specified method is not AJAX event handler: $method");

	$obj = new $className();
	if (!method_exists($obj, $method))
		throw new Phpr_ApplicationException("AJAX handler not found: $name");

	$obj->copy_context_from($controller);
	try
	{
		$result = $obj->$method();
		$controller->copy_context_from($obj);
		return $result;
	}
	catch (Exception $ex)
	{
		$controller->copy_context_from($obj);
		throw $ex;
	}
}

There’s a couple of things to note here.

  • Your second and third arguments in addEvent() are ignored.
  • _Actions is concatenated onto the end of your class name
  • Your method name must start with on_

With the above in mind, it’s time for some rewriting:

<?php

class MyModule_Module extends Core_ModuleBase
{
	public function subscribeEvents()
	{
		Backend::$events->addEvent('MyModule:on_submit', $this, 'on_submit');
	}
}

class MyModule_Actions extends Cms_ActionScope
{
	public function on_submit()
	{
		//...
	}
}

That worked like a charm. Good luck to all the module developers for LS out there – I’ve found LemonStand a number of quirks like this and we’ll just have to tackle them one at a time 🙂

Read More »

Posted (Updated ) in Linux

Note: Also see the prequel to this post: Why I Hate Unity

As your typical Ubuntu user, I find Unity infuriating and have devoted countless hours towards bringing back the usability and functionality that came with Gnome 2. I’ve racked up quite a few tweaks so far that have gone a long way towards doing this and figured it was about time to share them. My aim was to make 11.10 look and feel exactly like 10.10. I’ve attached below a screenshot of the final result.

11.10 with Gnome Session Fallback
11.10 with Gnome Session Fallback

Read More »