|
@@ -0,0 +1,172 @@
|
|
|
+<?php
|
|
|
+/**
|
|
|
+ * 加载配置
|
|
|
+ */
|
|
|
+function load_config()
|
|
|
+{
|
|
|
+ $GLOBALS['cfg'] = include(CONFIG_FILE);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 写入调试日志
|
|
|
+ * @param string $msg 日志消息
|
|
|
+ * @param string $type 日志级别
|
|
|
+ * @param string $file 文件名
|
|
|
+ * @return bool 操作状态
|
|
|
+ */
|
|
|
+function debug_log($msg, $type = 'DEBUG', $file = 'debug')
|
|
|
+{
|
|
|
+ global $cfg;
|
|
|
+ $type = strtoupper($type);
|
|
|
+ if (!in_array($type, $cfg['log_types'])) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ $msg = is_scalar($msg) ? strval($msg) : json_encode($msg, JSON_UNESCAPED_UNICODE);
|
|
|
+ $file = $cfg['log_path'] . '/' . $file . '.log';
|
|
|
+ clearstatcache(true, $file);
|
|
|
+ $flags = (file_exists($file) && filesize($file) >= $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;
|
|
|
+}
|