= $cfg['log_max_size']) ? 0 : FILE_APPEND; return file_put_contents($file, date("[Y-m-d H:i:s] ") . $type . ': ' . $msg . "\n", $flags); } /** * 确保只有一个实例在运行 * @param int $workerId WorkerID * @return string 锁文件路径 */ function run_single_instance($workerId) { //锁文件路径 $lock = __DIR__ . '/' . basename($_SERVER['argv'][0], '.php') . '.' . $workerId . '.pid'; //清除缓存,避免 file_exists() 取到缓存的结果 clearstatcache(true, $lock); //检查锁文件 if (file_exists($lock)) { $saved = trim(file_get_contents($lock)); $count = intval(shell_exec("ps -Fp {$saved} | grep '{$_SERVER['argv'][0]}' | grep -v grep | wc -l")); if ($count > 0) { exit(0); } shell_exec("ps -Fp {$saved}| grep '{$_SERVER['argv'][0]}' | grep -v grep | awk '{print $2}' | xargs --no-run-if-empty kill"); //安全起见再kill一次 } //保存当前进程ID if (!file_put_contents($lock, getmypid() . "\n")) { echo "Start failed: {$lock} write failed\n"; exit(1); } return $lock; } /** * 使用cURL发送POST请求 * @param string $url 请求地址 * @param array $post POST数据数组 * @param array $options HTTP选项数组 * @param string $error 用于返回错误信息 * @param int $errno 用于返回错误码 * @param string $httpCode 用于返回响应的HTTP状态码 * @param array $outHeaders 用于获得返回的HTTP头 * @return mixed 成功返回请求返回结果,失败返回flase */ function curl_post($url, $post = [], $options = [], &$error = false, &$errno = false, &$httpCode = false, $isupload = false, &$outHeaders = false) { $heads = array(); $defaults = [ CURLOPT_POST => 1, CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => 1, CURLOPT_CONNECTTIMEOUT => 5, CURLOPT_TIMEOUT => 10, CURLOPT_POSTFIELDS => ($isupload || is_string($post)) ? $post : http_build_query($post), ]; if ($isupload) { $defaults[CURLOPT_SAFE_UPLOAD] = true; } if (is_array($outHeaders)) { $defaults[CURLOPT_HEADERFUNCTION] = function ($c, $v) use(&$outHeaders) { if(!empty(rtrim($v))) { list($field, $value) = explode(':', $v, 2); if ($field && $value) { $outHeaders[strtolower($field)] = trim($value); } } return strlen($v); }; } $ch = curl_init(); $result = ''; if ($ch) { foreach ($options as $k=>$v) { $defaults[$k] = $v; } curl_setopt_array($ch, $defaults); $result = curl_exec($ch); if ($result === false) { if ($error !== false) { $error = curl_error($ch); } if ($errno !== false) { $errno = curl_errno($ch); } } if ($httpCode !== false) { $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); } curl_close($ch); } return $result; } /** * 使用cURL发送GET请求 * @param string $url 请求地址 * @param array $post GET数据数组 * @param array $options HTTP选项数组 * @param string $error 用于返回错误信息 * @param int $errno 用于返回错误码 * @param string $httpCode 用于返回响应的HTTP状态码 * @param array $outHeaders 用于获得返回的HTTP头 * @return mixed 成功返回请求返回结果,失败返回flase */ function curl_get($url, $get = [], $options = [], &$error = false, &$errno = false, &$httpCode = false, &$outHeaders = false) { $defaults = [ CURLOPT_URL => $url. (strpos($url, '?') === FALSE ? '?' : '&'). http_build_query($get), CURLOPT_HEADER => 0, CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_CONNECTTIMEOUT => 5, CURLOPT_TIMEOUT => 10, ]; if (is_array($outHeaders)) { $defaults[CURLOPT_HEADERFUNCTION] = function ($c, $v) use(&$outHeaders) { if (!empty(rtrim($v))) { list($field, $value) = explode(':', $v, 2); if ($field && $value) { $outHeaders[strtolower($field)] = trim($value); } } return strlen($v); }; } $ch = curl_init(); $result = ''; if ($ch) { foreach ($options as $k=>$v) { $defaults[$k] = $v; } curl_setopt_array($ch, $defaults); $result = curl_exec($ch); if ($result === false) { if ($error !== false) { $error = curl_error($ch); } if ($errno !== false) { $errno = curl_errno($ch); } } if ($httpCode !== false) { $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); } curl_close($ch); } return $result; }