Archive for the ‘Snippets’ Category
Google chart over HTTPS/SSL
The google charts API does not support the https protocol. If your website is being delivered through a secure connection, the chart will cause a SSL error. Here's a quick way to deliver google chart images over ssl.
To start off with, the chart image must be delivered from a secure connection. Google doesn't allow this plain and simple, so we need to figure out how to host it from our own site. We accomplish this by fetching the image from google using the standard API, writing it to a file, and then calling it on our own script. We basically make a image handling proxy.
Let's take a simple google chart to experiment with.
-
$chart_image = 'http://chart.apis.google.com/chart?chs=500x50&chf=bg,s,ffffff&cht=ls&chd=t:23.52,20.58,26.47,23.52,23.52,23.52,100.00,0.00,23.52,23.52,27.94,20.58,23.52&chco=0066ff';
Next we need to make a function to fetch and save the google chart locally. It will check the chart against the local copy and save it if the chart doesn't exist, or the image has changed. This way we aren't re-writing the same chart on every request, but if the chart changes, it will be updated appropriately.
-
{
-
}
-
-
return $file_name;
-
}
Lastly we tie it all together so that it is usable in our application. Im using this within a class, but this could just be used as a function as well. Your image directory will need to be writable for this to work.
-
public function doSomething()
-
{
-
-
$local_image_path = '/path/to/images/charts/';
-
$image_name = 'some_chart_image.png';
-
$chart_url = 'http://chart.apis.google.com/chart?chs=500x50&chf=bg,s,ffffff&cht=ls&chd=t:23.52,20.58,26.47,23.52,23.52,23.52,100.00,0.00,23.52,23.52,27.94,20.58,23.52&chco=0066ff';
-
-
$image = self::saveImage($chart_url ,$local_image_path,$image_name);
-
-
}
You'll need to implement your own error handling, and adjust this to meet the paths and specifics of your server, but the image can now be called from:
<img src="/images/charts/some_chart_image.png" alt="" />
If you need help creating your base chart image, this tool is a great place to start.
US States Snippet and SQL Dump
Here's some US states snippets. Included are php arrays, and a MySQL states dump...
PHP – Script benchmark / bottleneck debugging snippet
Here's a really simple function that I use for finding bottlenecks in php scripts. You can add any number of steps to the the script using the microtime() function, and this function shows the execution time of each step.
-
/**
-
* Benchmark a php script
-
*
-
* @param array $time_sample
-
* @return string HTML
-
*/
-
{
-
$output = '';
-
-
for($i=0;$i<$steps;$i++)
-
{
-
if($i<($steps-1))
-
{
-
$output .= '<p>Time '. ($i+1) .': '. number_format(($time_sample[$i+1] - $time_sample[$i]),6,'.','') .' seconds.</p>';
-
}
-
}
-
-
$output .= '<p>Total time: '. number_format(($time_sample[$steps-1] - $time_sample[0]),6,'.','') .' seconds.</p>';
-
-
return $output;
-
}
This is a simple example using sleep() to demonstrate the output.
The script outputs:
Time 1: 1.001833 seconds.
Time 2: 2.001427 seconds.
Time 3: 3.001124 seconds.
Time 4: 1.001720 seconds.
Total time: 7.006104 seconds.
It's a good idea to comment each time you record a microtime so that you know which section of script took that amount of time.
PHP – Random string generator snippet
This is a little function that I use all the time to generate random strings. There are 3 options for random strings with this: Alpha, Alpha-numeric, and Alpha-numeric with symbols. This is important because sometimes it's a good idea not to allow special characters in a php string. However, the special characters are great if you need to create a key or initialization vector for 2 way encryption.
This can be used to generate random passwords or keys or just about anything else that needs a random string. You can also throw this directly into a class and use it as a static method.
-
/**
-
* Generate a random string
-
*
-
* @param int $length
-
* @param int $mode 1 = Alpha, 2 = Alpha-numeric, 3 = Alpha-numeric with symbols
-
* @param boolian $char_set Set true for Upper and Lower case letters
-
* @return string
-
*/
-
function random_string($length=16,$mode=1,$char_set=false)
-
{
-
$string = '';
-
$possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
-
-
if($char_set) {
-
-
-
}
-
-
switch($mode) {
-
-
case 3:
-
-
$possible .= '`~!@#$%^&*()_-+=|}]{[":;<,>.?/';
-
-
case 2:
-
-
$possible .= '0123456789';
-
break;
-
-
}
-
-
for($i=1;$i<$length;$i++) {
-
$string .= $char;
-
}
-
-
return $string;
-
}
Examples:
-
//WQTISVJVMWSEFXEIQISJPCBENFEHQAN
-
//cZhVGHJb0PqJIk3
-
//=,:UT__GN[ST>GH
Querying with Propel Criteria using “NOT IN” (criteria::not_in)
It's fairly common to use "NOT IN" database queries in web development.
Symfony when using Propel does not have native support for using NOT IN queries in reference to another tables. You can use NOT IN and an array, but cannot use NOT IT in reference to another table.
Here's how to use NOT IN other_table with Propel and Symfony. Let's pretend we need to run this query.
-
SELECT * FROM my_table_1 WHERE id NOT IN (
-
SELECT id FROM my_table_2
-
);
Using Propel and Criteria, there is no native way of running this query. But, with the Criteria::CUSTOM modifier, we can force this query through propel.
It's actually very easy.
-
$c = new Criteria;
-
-
$not_in_query = 'my_table_1.id NOT IN (
-
SELECT id
-
FROM my_table_2)';
-
-
$c->add(MyTable1Peer::ID, $not_in_query, Criteria::CUSTOM);
-
-
$result = MyTable1Peer::doSelect($c);
You can add whatever other Criteria to the query as well. So far this is the only reliable way to run these sort of queries that I've found.
PHP Tutorial – Forking using wget in the background
I see a lot of people asking on how to use a fork to run a php script or web page in the background.
Here's a quick script I created using linux's wget to run another process in the background. You could use this to automatically upload something to another server, or just about anything that needs to happen after a user action.
Note: you must have exec enabled for this to work. This is a security risk, so make sure you know the potential damage that can be done by enabling exec, and by the script that you are running. Make absolutely sure to sanitize any input being transferred to the executed script.
In my case, I needed to initiate a file upload to a remote server after a certain action was taken. Because of the nature of the upload, it would have taken about 30 seconds before displaying any response to my user, which is an unacceptable delay.
First, make the script that needs to run in the background.