PHP生成圖片
//@function.php //先獲取個GET參數等下寫圖片里 if ($_GET["name"]) { $name = htmlspecialchars($_GET["name"]); } else { $name = ''; } //創建圖像 $img=getImgType($img_path); $img=createImg($img,$wordsPhoto,$left_px,$top_px,25,0,20,'19f','ARIALUNI'); //保存圖像 $img_info=saveImg($img,'png'); //創建圖像函數 function getImgType($img_path) { $img = getimagesize ( $img_path ); switch ($img [2]) { case 1 : $img = @imagecreatefromgif ( $img_path ); break; case 2 : $img = @imagecreatefromjpeg ( $img_path ); break; case 3 : $img = @imagecreatefrompng ( $img_path ); break; default : $img = @imagecreatefrompng ( $img_path ); } return $img; } //修改圖像函數 function createImg($img, $str, $x, $y, $length = 20, $angle = 0, $size = 12, $color = '39f', $font = 'kanghua') { switch ($color) { case '19f' : $color = imagecolorallocate ( $img, 22, 157, 252 ); break; case 'f37' : $color = imagecolorallocate ( $img, 255, 51, 119 ); break; case '63a' : $color = imagecolorallocate ( $img, 68, 172, 106 ); break; case 'f90' : $color = imagecolorallocate ( $img, 255, 158, 3 ); break; case 'a60' : $color = imagecolorallocate ( $img, 172, 106, 0 ); break; case '790' : $color = imagecolorallocate ( $img, 113, 149, 13 ); break; case 'fff' : $color = imagecolorallocate ( $img, 255, 255, 255 ); break; case '000' : $color = imagecolorallocate ( $img, 0, 0, 0 ); break; default : $color = imagecolorallocate ( $img, 67, 157, 252 ); } switch ($font) { case 'ARIALUNI' : $font = './../font/ARIALUNI.ttf'; break; case 'CODE2000' : $font = './../font/CODE2000.ttf'; break; case 'SarunsManorah' : $font = './../font/SarunsManorah.ttf'; break; case 'FreeSerif' : $font = './../font/FreeSerif.ttf'; break; case 'kanghua' : $font = './../font/kanghua.ttf'; break; case 'shishang' : $font = './../font/shishang.ttf'; break; case 'yahei' : $font = './../font/yahei.ttf'; break; default : $font = './../a_include/font/kanghua.ttf'; } $str = wordwrap_utf8 ( $str, $length ); imagettftext ( $img, $size, $angle, $x, $y, $color, $font, $str ); return $img; } //文字换行 function wordwrap_utf8($string, $length = 20, $break = "\n", $cut = false) { if ($length == 0) { return $string; } preg_match_all ( '/./u', $string, $matches ); $s = $matches [0]; $ct = count ( $s ); for($i = 0; $i < ceil ( $ct / $length ); $i ++) { $ns .= implode ( '', array_slice ( $s, $i * $length, $length ) ) . $break; } return $ns; } function saveImg($img, $type = 'png') { $img_url = ''; $img_name = time ().rand(10,99); //php5.5以上才支持webp if ($type == 'jpg') { $img_url = '/a_cache/' . $img_name . '.jpg'; $img_filename = dirname ( dirname ( dirname ( __FILE__ ) ) ) . '/a_cache/' . $img_name . '.jpg'; imagejpeg ( $img, $img_filename ); } else { $img_url = '/a_cache/' . $img_name . '.png'; $img_filename = dirname ( dirname ( dirname ( __FILE__ ) ) ) . '/a_cache/' . $img_name . '.png'; imagepng ( $img, $img_filename ); } imagedestroy ( $img ); $img_info ['img_name'] = $img_name; $img_info ['img_url'] = '..' . $img_url; return $img_info; }
網頁展示圖片
//@show.php require_once 'function.php'; <div style="width:100%;text-align:center;background-color: #58C7C2;padding: 0.52em 0.1em 0.52em 0.1em;"> <img id="res_pic" style="display: block;width: 70%;margin-left: 15%;" src="<?php echo $img_info['img_url'];?>" /> </div>
用corntab定期清理緩存圖片
創建可執行文件/www/del_cache,內容如下,意思是刪除兩天前的文件
#!/bin/bash find /path/to/your/a_cache/* -mtime +2 -exec rm -f {} \;
把執行文件加入定時任務
crontab -e #如果有多個編輯器,可能會讓選擇編輯器,但我CentOS中有nano,並沒有提示,我還是得用vi
修改並把下面一行粘貼到最後,意思是每小時的0分執行一次
00 * * * * /path/to/the/script
有時我們需要每30秒執行一次定時任務,但是crontab只能精確到分,可以這麼做:
* * * * * /path/to/executable param1 param2 * * * * * ( sleep 30 ; /path/to/executable param1 param2 )
這裡還有一個每90秒的例子:
*/3 * * * * /path/to/executable param1 param2 */3 * * * * ( sleep 90 ; /path/to/executable param1 param2 )
有時我們需要以root用戶來執行crontab中的命令,僅僅切換到root用戶然後使用crontab -e似乎還是不行,後來發現(CentOS下)可以這樣:
nano /etc/crontab #在這裡編輯需要定時執行的命令,並指定運行命令的用戶 03 * * * * root /path/to/the/script
有時的需求是這樣的,定時任務執行時間不確定,比如有時10分鐘,有時30分鐘,但是我們還不想同時執行兩個任務,這時可以使用flock文件鎖來控制只有一個程序在跑。
#下面的效果就是,每5分鐘檢查一次,如果在ping就跳過此次執行 */5 * * * * flock -xn /tmp/42ping.lock -c 'ping -c 1000 ft.wupo.info >> ping.log' #測試發現即使程序異常中斷,lock也會被解除,下次任務仍然得以運行
參考了How to Delete Old Files In A Folder Automatically In Linux、Running a cron every 30 seconds。對於crontab的寫法,可以到crontab.guru來驗證是否正確。其實我主要是想記錄這一段。
本文更新於 2017/03/07。