应用场景
将一个流程固定为方法
并将 能使用由用户定义的函数来处理数据
此方法的主要功能
1. 获得任务
2.采集任务
3.同步任务
//我们可以发现这里面的 除了采集方法外 很多都是可以重用的 //获得采集数据// if ($taskTable->getSwitchStatus("spiderBeg")) { $taskList = $taskTable->getTaskList("0,30000", $WinTask["status"], $_ini["image_task"]["enabledGropTask"])->toArray(); $i = 0; foreach ($taskList as $value) { $i++; echo "循环ID " . $i . "\t"; if ($value["task_content"] == "") { $taskTable->upTaskStatus($value["fig"], "F"); echo $value["fig"] . "\t" . $value["task_content"] . "\t错误 F \r\n"; continue; } if ($Collection->getImageSave($value["task_content"], $ImageSaveDir)) { //跟新状态/ $taskTable->upTaskStatus($value["fig"], "Y"); //同步源数据/ if ($taskTable->getSwitchStatus("syncOri")) { $taskTable->syncOriTable( $taskTable->oriTable, "local_image='" . $Collection->retrieve($value["task_content"]) . "'", "ASIN='" . $value["fig"] . "'", $value["fig"] ); } } else { echo $value["fig"] . "\t" . $value["task_content"] . "\t错误 SP \r\n"; $taskTable->upTaskStatus($value["fig"], "F"); }; } }
将这个方法 抽像出来 使其可用通用
抽离成函数后
function runTaskContent($runAction) { $taskList = $this->taskTable->getTaskList( $this->limit, $this->taskTable->runStatus, $this->taskTable->grop )->toArray(); $i = 0; foreach ($taskList as $value) { $i++; echo "循环ID " . $i . "\t"; if ($value["task_content"] == "") { $this->taskTable->upTaskStatus($value["fig"], "F"); echo $value["fig"] . "\t" . $value["task_content"] . "\t错误 F \r\n"; continue; } //函数将在这里使用 $returnAction = $runAction($value); if ($returnAction ) { //跟新状态/ $this->taskTable->upTaskStatus($value["fig"], "Y"); //同步源数据/ if ($this->taskTable->getSwitchStatus("syncOri")) { $this->taskTable->syncOriTable( $this->taskTable->oriTable, $returnAction["sync_set"], $returnAction["sync_where"], $returnAction["is_figid"] ); } } else { echo $value["fig"] . "\t" . $value["task_content"] . "\t错误 SP \r\n"; $this->taskTable->upTaskStatus($value["fig"], "F"); }; } }
可以实现上面效果的其他方法
// 栗子 public function toHtml($block = false) { //在view 视图中创建块 if (!$block) { $template = self::$template; } else { $template = self:: $createBlock; } foreach ($template as $value) { $blockName = explode('.', $value['blockName']); $blockValue = "Weicot\\" . $blockName[0] . "\\Block\\" . $blockName[1]; $templatePath = BASE_PATH . DS . self::$templateDir . $value['templatePath'] . ".phtml"; Debug::showPath($blockValue, $templatePath); if (file_exists($templatePath)) { $block = new $blockValue; if (isset($value['action']) && !empty($value['action'])) { //判断是否初始化 block 函数 if (isset($value['value']) && !empty($value['value'])) { $block->exe($value['action'], $value['value']); } else { $block->exe($value['action']); } } require_once($templatePath); } else { echo "Template Not Found"; } } }
WeiCot Framework 布局引擎
完整的使用代码
//这个 和上面的功能一样 只不过简化了许多步骤 使方法可以重用 //获得采集数据 if ($RunService->taskTable->getSwitchStatus("spiderBeg")) { $RunService->runTaskContent(function ($value) use ($RunService, $ImageSaveDir) { if ($RunService->Collection->getImageSave($value["task_content"], $ImageSaveDir)) { return [ "sync_set" => "local_image='" . $RunService->Collection->retrieve($value["task_content"]) . "'", "sync_where" => "ASIN='" . $value["fig"] . "'", "is_figid" => $value["fig"] ]; } else { return false; }; }); }
完整代码介绍
<?php /** * WeiCot Sp Framework * User: ajiang * WebSite: WWW.WEICOT.COM * Date: 2017/7/28 0028 * Time: 17:25 */ require_once dirname(__FILE__) . "/ini/bootstrap.php"; $_ini = $ini_sp; use Weicot\Spider\RunService; $RunService = new RunService(); $RunService->_ini($_ini, "image_task"); //使用配置文件种的 image_task 中数据配置以及基础配置 $RunService->setTaskIni([ "grop" => $WinTask["grop"], "service" => $WinTask["service"], "limit" => $WinTask["limit"], "run_status" => $WinTask["status"] ]); $RunService->Collection->setDirArry($_ini["image_task"]["path_array"]); //设置分布式资源目录 $ImageSaveDir = $_ini["image_task"]["image_path"]; //文件保存目录 $RunService->taskTable->distinguishServiceId=false; //取消由多进程同步源表所分配的任务ID 方便重新分配任务表中任务 //同步数据 if ($RunService->taskTable->getSwitchStatus("importData")) { $sqlTask = 'select image,id from ' . $RunService->taskTable->oriTable . ' where image<>"" and islock="' . $_ini["image_task"]["ori_status"] . '" limit ' . $WinTask["limit"]; $selectData = $RunService->db->data($sqlTask); foreach ($selectData["data"] as $value) { $imageGrop = explode("|", $value["image"]); foreach ($imageGrop as $value2) { //添加进采集// $upStatusOri = 'UPDATE ' . $RunService->taskTable->oriTable . ' SET islock="Y" where id="' . $value["id"] . '";'; if ($RunService->db->exe($upStatusOri)) { echo "Ori Data Lock\r\n"; } $RunService->taskTable->addTask($value["id"], $value2); } } } //获得采集数据 if ($RunService->taskTable->getSwitchStatus("spiderBeg")) { $RunService->runTaskContent(function ($value) use ($RunService, $ImageSaveDir) { if ($RunService->Collection->getImageSave($value["task_content"], $ImageSaveDir)) { return [ "sync_set" => "local_image='" . $RunService->Collection->retrieve($value["task_content"]) . "'", "sync_where" => "ASIN='" . $value["fig"] . "'", "is_figid" => $value["fig"] ]; } else { return false; }; }); }
参考 与引用匿名函数
转载请注明:(●--●) Hello.My Weicot » php 匿名函数[function() use(){}] 的应用场景 函数注入 并使组件重用