eAccelerator and open_basedir: open_basedir restriction in effect. File() is not within the allowed path(s):
After installing eAccelerator on a CentOS 5.5 server running PHP 5.2.10, a bunch of websites began failing with open_basedir errors like so:
[Fri Jul 16 17:53:50 2010] [error] [client XX.XX.XXX.XXX] PHP Warning: require() [function.require]: open_basedir restriction in effect. File() is not within the allowed path(s): (/home/username/) in /home/username/public_html/wp-settings.php on line 19, referer: http://www.server.com/
After doing some research it turns out that a default option that is compiled into eAccelerator is incompatible with open_basedir. The fix is easy enough, simply re-compile with the --without-eaccelerator-use-inode option like so:
make clean
phpize
./configure --without-eaccelerator-use-inode
make
make install
After re-compiling and installing, make sure you clear out the existing eAccelerator files before restarting Apache:
rm -rf /var/cache/eaccelerator/*
apachectl restart
eAccelerator states that the next version will have this compile option set by default.
Reference:
PHP: How to capture output of echo into a local variable.
I've been customizing a WordPress install and have been needing to capture the output of the bloginfo() function, which simply echo's a string. I wanted to capture the echo into a variable without actually echo'ing the string. You can do so by leveraging PHP's output buffering functions. Here's how you do it:
ob_start();
echo 'Hello World';
$myStr = ob_get_contents();
ob_end_clean();
$myStr will now contain 'Hello World' without actually outputting it to the screen.
Reference:
FCKEditor: Remove & prevent <p> tags from wrapping your content.
For some reason, FCKEditor automatically wraps any content entered into the textbox with a <p> tag. This can cause for some problems in your layout when you're actually displaying the content. Instead of trying to fix this in your layout with CSS, there is a quick and easy way to turn the auto-wrap off in FCKEditor: Change the FCKConfig.EnterMode setting from 'p' to 'br'. There are a few ways to handle this:
- Edit fckconfig.js:
Change FCKConfig.EnterMode = 'p'; to FCKConfig.EnterMode = 'br'; - Change the setting programatically when you instantiate the object, like so (in PHP):
<?php
include_once('fckeditor/fckeditor.php');
$oFCKeditor = new FCKeditor('description');
$oFCKeditor->BasePath = '/fckeditor/';
$oFCKeditor->Value = 'some text';
$oFCKeditor->Config['EnterMode'] = 'br'; // turn off auto <p> tags wrapping content
$oFCKeditor->Create();
?>
I prefer the latter way because you can do it on a page by page basis, and there's no messing with FCK's core JavaScript files.
PHP & ionCube Loader: ‘The Loader must appear as the first entry in the php.ini file in Unknown on line 0′
I received the following in my Apache error_log when attempting to load the ionCube loader in my php.ini file:
PHP Fatal error: [ionCube Loader] The Loader must appear as the first entry in the php.ini file in Unknown on line 0
This is because ionCube must be loaded before any of the Zend extensions are. So if you have the Zend extension/optimizer loaded, your php.ini should look like this to get ionCube to work:
[Zend]
zend_extension=/usr/local/ioncube/ioncube_loader_lin_5.1.so
zen_extension_ts=/usr/local/ioncube/ioncube_loader_lin_5.1_ts.so
zend_extension_manager.optimizer=/usr/local/Zend/lib/Optimizer-3.3.0
zend_extension_manager.optimizer_ts=/usr/local/Zend/lib/Optimizer_TS-3.3.0
zend_optimizer.version=3.3.0a
zend_extension=/usr/local/Zend/lib/ZendExtensionManager.so
zend_extension_ts=/usr/local/Zend/lib/ZendExtensionManager_TS.so
----------------
Now playing: Tommy McCook & The Aggrovators - A Loving Melody
via FoxyTunes
mod_rewrite & PHP: How to match urlencoded plus sign (+ = %2B)
I ran into trouble when trying to pass a urlencode()'ed plus sign into a web address being processed by mod_rewrite.
$url = 'http://www.server.com/browsealpha/name+has+plus+in+it/';
$url = urlencode($url); // http://www.server.com/browsealpha/name%2Bhas%2Bplus%2Bin%2Bit/
This $url variable gets echo()'d as a link in a page, so once it's clicked and loaded in the browser, I then needed mod_rewrite to translate that to the actual URL, which is:
http://www.server.com/browsealpha.php?name=name%2Bhas%2Bplus%2Bin%2Bit
Here is the RewriteRule I was using to match:
# match any name containing any combination of letters, numbers, and the % sign (to match urlencoded URLs)
RewriteRule ^browsealpha/([%\w]*)/?$ /browsealpha.php?name=$1 [QSA,L]
This rule should match http://www.server.com/browsealpha/name%2Bhas%2Bplus%2Bin%2Bit/ but for some reason it wouldn't work. After hours of frustration, I found a few threads mentioning the need to urlencode() the string twice, like so:
urlencode(urlencode($variable));
IT WORKS!!! Apparently this is because mod_rewrite automatically decodes the urlencoded URL, so if you pass in %2B, PHP sees it as %2B0. If you double encode, mod_rewrite decodes the first one, and PHP receives the second one (which is now %2B, which is what we want).
----------------
Now playing: Autechre - 444
via FoxyTunes
PHP & imagettftext with Webcore TrueType fonts.
If you're trying to write some text using PHP/GD & the imagettftext() function, you will of course need some TrueType fonts to work with. I've found a great set of fonts available for free: Webcore. Webcore contains all the fonts web designers constantly use, things like Arial, Tahoma, Verdana, Georgia, etc..
To install, simply download to your server and install the RPM (Fedora):
shell> wget http://avi.alkalay.net/software/webcore-fonts/webcore-fonts-3.0-1.noarch.rpm
shell> rpm -i webcore-fonts-3.0-1.noarch.rpm
These fonts will now be available to you in /usr/share/fonts/webcore/.
Make sure you specify the full path when calling imagettftext(), eg:
<?php
// Set the content-type
header("Content-type: image/png");
// Replace path by your own font path
$font = '/usr/share/fonts/webcore/arial.ttf';
// Create the image
$im = imagecreatetruecolor(400, 30);
// Create some colors
$white = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 399, 29, $white);
// The text to draw
$text = 'Hello world!';
// Add some text
imagettftext($im, 20, 0, 10, 20, $black, $font, $text);
// Using imagepng() results in clearer text compared with imagejpeg()
imagepng($im);
imagedestroy($im);
?>
Your mileage may vary if you are using a different distribution, but the docs state that this RPM should work on other distros.