//先从传感器读取当前的cpu温度。
function temperature()
{
$sensor = `sensors`;
preg_match('/.*?\+([\d\.]+)/is', $sensor, $matches);
return floatval($matches[1]);
}
//休息的毫秒数,试过秒,时间粒度太大,不好精确控制。微秒又太细小。
//最终觉得用毫秒做单位(1/1000秒)最好
$rest = 200;
do
{
//这是个虚构的获取所有要做的任务的函数
//我的真实任务列表写的太乱不拿出来现眼了。
$tasks = getAllTasks();
//挨个的处理。
foreach($tasks as $task)
{
//根据温度来调节任务间休息的毫秒数
$rest += $temp-60.0;
if($rest>0)usleep($rest*1000);
var_dump($temp,$rest);
$task->run();
}
}
while(count($tasks));
经过程序的一番自我调整。
最终cpu温度稳定在了60摄氏度。
虽然还有点高。但是已经比以前的80多度好多了。
cpu温度太低说明它偷懒,是资源浪费。
欢迎拍砖。
<?php
/**
* 多任务并发执行演示.
* @author rains31@gmail.com
* 请在linux的shell里面执行本程序,珍爱生命,远离windows.
*/
//最大并发数,用来保护服务器不被累死
define('MAX_CONCURRENCY', 10);
/**
* 多任务并发类
*/
class MultiTask
{
/**
* 任务池
* @var array $pool
*/
private $pool = array();
/**
* 并发数
* @var int $concurrency
*/
private $concurrency = 1;
/**
* 设置并发数
* @param int $concurrency
*/
public function setConcurrency($concurrency = 1)
{
if($concurrency>=1 && $concurrency<=MAX_CONCURRENCY)
{
$this->concurrency = $concurrency;
}
}
/**
* 添加一个新任务. 如果任务池满了,就先消化一个任务池内的任务.
* @param Task $new_task
* @return bool
*/
public function addTask(Task $new_task)
{
$pool = &$this->pool;
$status = $new_task->status();
if($this->isFull())
{
$this->doWork();
}
$pool[] = $new_task;
echo "new task {$status['command']}\r\n";
return true;
}
/**
* 消化一个任务池内的任务,本方法是本程序的核心所在
* @return bool
*/
private function doWork()
{
$pool = &$this->pool;
while($this->notEmpty())
{
foreach($pool as $tid=>$task)
{
$status = $task->status();
if($task->isRunning())
{
if($task->isTimeout())
{
echo "task:$tid:{$status['command']} timeout, force closed!\r\n";
$task->terminate();
unset($pool[$tid]);
return false;
}
echo "checking task:$tid:{$status['command']}:".intval($status['excute_time'])."\r\n";
}
else
{
echo "task:$tid:{$status['command']} finished!\r\n";
<?php
$fruits = array('香蕉','橘子','苹果','梨','桃');
function etc($arr)
{
if(count($arr)<3)
{
$ret = join(',',$arr);
}
else
{
$ret = join(',',array_splice($arr, 0, 3)).'等';
}
return $ret;
}
echo '我喜欢吃'.etc($fruits);
-----------------------------
output:
我喜欢吃香蕉,橘子,苹果等
fopen
flock
fgets
fgetc
fgetcsv
fread
fwrite
fseek
ftell
ftruncate
fclose
file
file_get_contents
file_put_contents
rename
unlink