functions.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?php
  2. /**
  3. * 加载配置
  4. */
  5. function load_config()
  6. {
  7. $GLOBALS['cfg'] = include(CONFIG_FILE);
  8. }
  9. /**
  10. * 写入调试日志
  11. * @param string $msg 日志消息
  12. * @param string $type 日志级别
  13. * @param string $file 文件名
  14. * @return bool 操作状态
  15. */
  16. function debug_log($msg, $type = 'DEBUG', $file = 'debug')
  17. {
  18. global $cfg;
  19. $type = strtoupper($type);
  20. if (!in_array($type, $cfg['log_types'])) {
  21. return false;
  22. }
  23. $msg = is_scalar($msg) ? strval($msg) : json_encode($msg, JSON_UNESCAPED_UNICODE);
  24. $file = $cfg['log_path'] . '/' . $file . '.log';
  25. clearstatcache(true, $file);
  26. $flags = (file_exists($file) && filesize($file) >= $cfg['log_max_size']) ? 0 : FILE_APPEND;
  27. return file_put_contents($file, date("[Y-m-d H:i:s] ") . $type . ': ' . $msg . "\n", $flags);
  28. }
  29. /**
  30. * 确保只有一个实例在运行
  31. * @param int $workerId WorkerID
  32. * @return string 锁文件路径
  33. */
  34. function run_single_instance($workerId)
  35. {
  36. //锁文件路径
  37. $lock = __DIR__ . '/' . basename($_SERVER['argv'][0], '.php') . '.' . $workerId . '.pid';
  38. //清除缓存,避免 file_exists() 取到缓存的结果
  39. clearstatcache(true, $lock);
  40. //检查锁文件
  41. if (file_exists($lock)) {
  42. $saved = trim(file_get_contents($lock));
  43. $count = intval(shell_exec("ps -Fp {$saved} | grep '{$_SERVER['argv'][0]}' | grep -v grep | wc -l"));
  44. if ($count > 0) {
  45. exit(0);
  46. }
  47. shell_exec("ps -Fp {$saved}| grep '{$_SERVER['argv'][0]}' | grep -v grep | awk '{print $2}' | xargs --no-run-if-empty kill"); //安全起见再kill一次
  48. }
  49. //保存当前进程ID
  50. if (!file_put_contents($lock, getmypid() . "\n")) {
  51. echo "Start failed: {$lock} write failed\n";
  52. exit(1);
  53. }
  54. return $lock;
  55. }
  56. /**
  57. * 使用cURL发送POST请求
  58. * @param string $url 请求地址
  59. * @param array $post POST数据数组
  60. * @param array $options HTTP选项数组
  61. * @param string $error 用于返回错误信息
  62. * @param int $errno 用于返回错误码
  63. * @param string $httpCode 用于返回响应的HTTP状态码
  64. * @param array $outHeaders 用于获得返回的HTTP头
  65. * @return mixed 成功返回请求返回结果,失败返回flase
  66. */
  67. function curl_post($url, $post = [], $options = [], &$error = false, &$errno = false, &$httpCode = false, $isupload = false, &$outHeaders = false)
  68. {
  69. $heads = array();
  70. $defaults = [
  71. CURLOPT_POST => 1,
  72. CURLOPT_URL => $url,
  73. CURLOPT_RETURNTRANSFER => 1,
  74. CURLOPT_CONNECTTIMEOUT => 5,
  75. CURLOPT_TIMEOUT => 10,
  76. CURLOPT_POSTFIELDS => ($isupload || is_string($post)) ? $post : http_build_query($post),
  77. ];
  78. if ($isupload) {
  79. $defaults[CURLOPT_SAFE_UPLOAD] = true;
  80. }
  81. if (is_array($outHeaders)) {
  82. $defaults[CURLOPT_HEADERFUNCTION] = function ($c, $v) use(&$outHeaders) {
  83. if(!empty(rtrim($v))) {
  84. list($field, $value) = explode(':', $v, 2);
  85. if ($field && $value) {
  86. $outHeaders[strtolower($field)] = trim($value);
  87. }
  88. }
  89. return strlen($v);
  90. };
  91. }
  92. $ch = curl_init();
  93. $result = '';
  94. if ($ch) {
  95. foreach ($options as $k=>$v) {
  96. $defaults[$k] = $v;
  97. }
  98. curl_setopt_array($ch, $defaults);
  99. $result = curl_exec($ch);
  100. if ($result === false) {
  101. if ($error !== false) {
  102. $error = curl_error($ch);
  103. }
  104. if ($errno !== false) {
  105. $errno = curl_errno($ch);
  106. }
  107. }
  108. if ($httpCode !== false) {
  109. $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  110. }
  111. curl_close($ch);
  112. }
  113. return $result;
  114. }
  115. /**
  116. * 使用cURL发送GET请求
  117. * @param string $url 请求地址
  118. * @param array $post GET数据数组
  119. * @param array $options HTTP选项数组
  120. * @param string $error 用于返回错误信息
  121. * @param int $errno 用于返回错误码
  122. * @param string $httpCode 用于返回响应的HTTP状态码
  123. * @param array $outHeaders 用于获得返回的HTTP头
  124. * @return mixed 成功返回请求返回结果,失败返回flase
  125. */
  126. function curl_get($url, $get = [], $options = [], &$error = false, &$errno = false, &$httpCode = false, &$outHeaders = false)
  127. {
  128. $defaults = [
  129. CURLOPT_URL => $url. (strpos($url, '?') === FALSE ? '?' : '&'). http_build_query($get),
  130. CURLOPT_HEADER => 0,
  131. CURLOPT_RETURNTRANSFER => TRUE,
  132. CURLOPT_CONNECTTIMEOUT => 5,
  133. CURLOPT_TIMEOUT => 10,
  134. ];
  135. if (is_array($outHeaders)) {
  136. $defaults[CURLOPT_HEADERFUNCTION] = function ($c, $v) use(&$outHeaders) {
  137. if (!empty(rtrim($v))) {
  138. list($field, $value) = explode(':', $v, 2);
  139. if ($field && $value) {
  140. $outHeaders[strtolower($field)] = trim($value);
  141. }
  142. }
  143. return strlen($v);
  144. };
  145. }
  146. $ch = curl_init();
  147. $result = '';
  148. if ($ch) {
  149. foreach ($options as $k=>$v) {
  150. $defaults[$k] = $v;
  151. }
  152. curl_setopt_array($ch, $defaults);
  153. $result = curl_exec($ch);
  154. if ($result === false) {
  155. if ($error !== false) {
  156. $error = curl_error($ch);
  157. }
  158. if ($errno !== false) {
  159. $errno = curl_errno($ch);
  160. }
  161. }
  162. if ($httpCode !== false) {
  163. $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  164. }
  165. curl_close($ch);
  166. }
  167. return $result;
  168. }