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。