5 |
6 |
--------------------------------------------------------------------------------
/ChaoxingSign/Config.php:
--------------------------------------------------------------------------------
1 | [
17 | '这里填你的超星账号 1' => [
18 | 'state' => true,//是否启用 Server酱 通知,true: 启用 false: 不启用
19 |
20 | //填入该值,表示你使用的是新版推送通道。旧版推送通道将于 2021年4月 下线
21 | //SendKey 获取地址:https://sct.ftqq.com/sendkey
22 | 'SendKey' => '',
23 | ],
24 | '这里填你的超星账号 2' => [
25 | 'state' => true,//是否启用 Server酱 通知,true: 启用 false: 不启用
26 |
27 | //填入该值,表示你使用的是新版推送通道。旧版推送通道将于 2021年4月 下线
28 | // SendKey 获取地址:https://sct.ftqq.com/sendkey
29 | 'SendKey' => '',
30 | ],
31 | //... 多账号部署
32 | ],
33 | 'Telegram' => [
34 | '这里填你的超星账号 1' => [
35 | 'state' => true,
36 | 'TG_CHAT_ID' => '',
37 | 'TG_BOT_TOKEN' => '',
38 | ]
39 | ],
40 | 'Bark' => [
41 | '这里填你的超星账号 1' => [
42 | 'state' => true,
43 | 'BARK_PUSH_API' => ''
44 | ]
45 | ],
46 | 'Go-cqhttp' => [
47 | '这里填你的超星账号 1' => [
48 | 'state' => true,
49 | 'QQ' => '',//填写推送到的QQ号或群号
50 | 'API' => '',//示例:http://domain.com:5700/send_private_msg,如果是发送到群就是send_group_msg
51 | 'access-token' => ''//如果有就填上
52 | ]
53 | ]
54 | //TODO: 接入钉钉机器人通知
55 | ];
56 |
57 | ?>
--------------------------------------------------------------------------------
/ChaoxingSign/cookie/README.md:
--------------------------------------------------------------------------------
1 | 保存用户 Cookie 的目录
--------------------------------------------------------------------------------
/ChaoxingSign/index.php:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ChaoxingSign/lib/Functions.php:
--------------------------------------------------------------------------------
1 | 获取课程 courseId、classId
7 |
8 | define("TASK_ID", "https://mobilelearn.chaoxing.com/ppt/activeAPI/taskactivelist?courseId=%s&classId=%s");//获取任务 ID
9 | define("TASK_ID_OLD", "http://mobilelearn.chaoxing.com/widget/pcpick/stu/index?courseId=%s&jclassId=%s");//获取任务 ID
10 |
11 | define("PRE_SIGN_API", "https://mobilelearn.chaoxing.com/newsign/preSign?courseId=%s&classId=%s&activePrimaryId=%s&general=1&sys=1&ls=1&appType=15&&tid=&ut=s");//预签到API
12 | define("SIGN_API", "https://mobilelearn.chaoxing.com/pptSign/stuSignajax?activeId=%s");//获取任务 ID
13 | define("SIGN_API_WITH_GPS", "https://mobilelearn.chaoxing.com/pptSign/stuSignajax?activeId=%s&latitude_gd=%s&longitude_gd=%s&longitude=%s&latitude=%s&address=%s"); //签到(位置)
14 | define("SIGN_API_OLD", "http://mobilelearn.chaoxing.com/widget/sign/pcStuSignController/preSign?activeId=%s&classId=%s&courseId=%s");//<旧方法>获取任务 ID
15 |
16 | /**
17 | * 判断某时间是否在某个区间内
18 | * @param int $time 传入秒级时间戳 time()
19 | * @param array $timeBetween 传入区间,如 ['08:00:00', '18:00:00']
20 | * @return bool true: 在时间区间内,false:不在时间区间内
21 | */
22 | function timeInterval(int $time, array $timeBetween)
23 | {
24 | $checkDayStr = date('Y-m-d', time());
25 | $timeBegin = strtotime($checkDayStr . $timeBetween[0]);
26 | $timeEnd = strtotime($checkDayStr . $timeBetween[1]);
27 |
28 | if ($time > $timeBegin && $time < $timeEnd) {
29 | return true;
30 | }
31 |
32 | return false;//不在时间区间内
33 | }
34 |
35 | /**
36 | * SERVER CHAN 微信推送
37 | * @param string $text 消息标题,最长为256,必填。
38 | * @param string $desp 消息内容,最长64Kb,可空,支持MarkDown。
39 | * @param string $key 获取方式:http://sc.ftqq.com/?c=code
40 | * @return false|string
41 | */
42 | function sc_send($text = '', $desp = '', $key = '')
43 | {
44 | $postdata = http_build_query(
45 | array(
46 | 'text' => $text,
47 | 'desp' => $desp
48 | )
49 | );
50 |
51 | $opts = array('http' =>
52 | array(
53 | 'method' => 'POST',
54 | 'timeout' => 5,//超时时间 5秒
55 | 'header' => 'Content-type: application/x-www-form-urlencoded',
56 | 'content' => $postdata
57 | )
58 | );
59 | $context = stream_context_create($opts);
60 |
61 | return json_decode(@file_get_contents('https://sctapi.ftqq.com/' . $key . '.send', false, $context), true);
62 | }
63 |
64 | /**
65 | * Telegram 推送
66 | */
67 | function tg_send($chatID, $message, $token)
68 | {
69 | $url = "https://api.telegram.org/bot" . $token . "/sendMessage?chat_id=" . $chatID;
70 | $url = $url . "&text=" . urlencode($message);
71 | $ch = curl_init();
72 | $optArray = array(
73 | CURLOPT_URL => $url,
74 | CURLOPT_RETURNTRANSFER => true
75 | );
76 | curl_setopt_array($ch, $optArray);
77 | $result = curl_exec($ch);
78 | curl_close($ch);
79 | $result = json_decode($result, true);
80 | return $result;
81 | }
82 |
83 | /**
84 | * Bark 推送
85 | */
86 | function bark_send($title, $content, $api)
87 | {
88 | $url = $api."/".urlencode($title)."/".urlencode($content)."/?icon=https://s3.missuo.me/images/azB3Ba.jpg";
89 | $res = curl_get($url);
90 | $result = json_decode($res, true);
91 | return $result;
92 | }
93 |
94 | /**
95 | * Go-cqhttp 推送
96 | */
97 | function Go_cqhttp_send($QQ, $message, $API, $access_token = null)
98 | {
99 | $postdata = array();
100 | if(!empty(preg_match('#send_private_msg#i',$API)))
101 | {
102 | $postdata['user_id'] = $QQ;
103 | }
104 | else
105 | {
106 | $postdata['group_id'] = $QQ;
107 | }
108 | $postdata['message'] = $message;
109 | $postdata['auto_escape'] = true;
110 | $ch = curl_init();
111 | $optArray = array(
112 | CURLOPT_URL => $API,
113 | CURLOPT_POST => true,
114 | CURLOPT_POSTFIELDS => json_encode($postdata),
115 | CURLOPT_RETURNTRANSFER => true,
116 | CURLOPT_HTTPHEADER => array('Content-Type: application/json','Authorization: Bearer '.$access_token)
117 | );
118 | curl_setopt_array($ch, $optArray);
119 | $result = curl_exec($ch);
120 | curl_close($ch);
121 | $result = json_decode($result, true);
122 | return $result;
123 | }
124 |
125 | /**
126 | * 判断是否为命令行模式
127 | * @return bool
128 | */
129 | function is_cli()
130 | {
131 | return preg_match("/cli/i", php_sapi_name()) ? true : false;
132 | }
133 |
134 |
135 | /**
136 | * 获取课程列表 <旧方法,保留备用>
137 | * @param $html
138 | * @return array
139 | * @author Chuwen
140 | */
141 | function get_course_list($html)
142 | {
143 | $data = selector::select($html, 'li[style="position:relative"]', 'css');
144 |
145 | if ($data === NULL) return [];
146 |
147 | $class_list = [];
148 | foreach ($data as $k => $v) {
149 | $class_list[] = [
150 | 'courseId' => selector::select($v, '@@', 'regex'),
151 | 'classId' => selector::select($v, '@@', 'regex'),
152 | 'title' => selector::select($v, '.clearfix > a', 'css'),
153 | ];
154 | }
155 |
156 | return $class_list;
157 | }
158 |
159 |
160 | function get($parameter, $default = null, $filter = 'trim')
161 | {
162 | return isset($_GET[$parameter]) ? $filter($_GET[$parameter]) : $default;
163 | }
164 |
165 | /**
166 | * @param $parameter
167 | * @param null $default
168 | * @param string $filter
169 | * @return null
170 | * @author Chuwen
171 | */
172 | function post($parameter, $default = null, $filter = 'trim')
173 | {
174 | return isset($_POST[$parameter]) ? $filter($_POST[$parameter]) : $default;
175 | }
176 |
177 |
178 | /**
179 | *curl get请求
180 | */
181 | function curl_get($url, $cookie_jar = '', $header_type="PC")
182 | {
183 | $curl = curl_init();
184 | curl_setopt($curl, CURLOPT_URL, $url);//登陆后要从哪个页面获取信息
185 | curl_setopt($curl, CURLOPT_HEADER, true);
186 | curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
187 |
188 | if(parse_url($url)['scheme'] == 'https'){
189 | //验证SSL
190 | curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, TRUE);
191 | //验证域名是否匹配
192 | curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
193 | }
194 | else{
195 | //取消 SSL 证书验证
196 | curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
197 | curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
198 | }
199 |
200 | if($header_type == "PC"){
201 | curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36");
202 | }else{
203 | curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 (device:iPhone13,2) Language/zh-Hans com.ssreader.ChaoXingStudy/ChaoXingStudy_3_5.2.1_ios_phone_202204211530_81 (@Kalimdor)_14895834084271104281");
204 | }
205 |
206 | curl_setopt($curl, CURLOPT_TIMEOUT, 10);
207 |
208 | // $streamVerboseHandle = fopen("out.txt", 'a+');
209 | // curl_setopt($curl, CURLOPT_VERBOSE, 1);
210 | // curl_setopt($curl, CURLOPT_STDERR, $streamVerboseHandle);
211 |
212 | if (!empty($cookie_jar)) {
213 | curl_setopt($curl, CURLOPT_COOKIEFILE, realpath($cookie_jar)); //读取现有Cookie
214 | curl_setopt($curl, CURLOPT_COOKIEJAR, realpath($cookie_jar)); //保存返回的Cookie
215 | }
216 |
217 | $content = curl_exec($curl);
218 | list($header, $body) = explode("\r\n\r\n", $content, 2);
219 |
220 | curl_close($curl);
221 | // fclose($streamVerboseHandle);
222 | return $body;
223 | }
224 |
225 | ?>
--------------------------------------------------------------------------------
/ChaoxingSign/lib/Selector.php:
--------------------------------------------------------------------------------
1 |
75 | * @created time :2016-10-26 12:53
76 | */
77 | private static function _xpath_select($html, $selector, $remove = false)
78 | {
79 | if (!is_object(self::$dom))
80 | {
81 | self::$dom = new DOMDocument();
82 | }
83 |
84 | // 如果加载的不是之前的HTML内容,替换一下验证标识
85 | if (self::$dom_auth != md5($html))
86 | {
87 | self::$dom_auth = md5($html);
88 | @self::$dom->loadHTML(''.$html);
89 | self::$xpath = new DOMXpath(self::$dom);
90 | }
91 |
92 | //libxml_use_internal_errors(true);
93 | //self::$dom->loadHTML(''.$html);
94 | //$errors = libxml_get_errors();
95 | //if (!empty($errors))
96 | //{
97 | //print_r($errors);
98 | //exit;
99 | //}
100 |
101 | $elements = @self::$xpath->query($selector);
102 | if ($elements === false)
103 | {
104 | self::$error = "the selector in the xpath(\"{$selector}\") syntax errors";
105 | // 不应该返回false,因为isset(false)为true,更不能通过 !$values 去判断,因为!0为true,所以这里只能返回null
106 | //return false;
107 | return null;
108 | }
109 |
110 | $result = array();
111 | if (!is_null($elements))
112 | {
113 | foreach ($elements as $element)
114 | {
115 | // 如果是删除操作,取一整块代码
116 | if ($remove)
117 | {
118 | $content = self::$dom->saveXml($element);
119 | }
120 | else
121 | {
122 | $nodeName = $element->nodeName;
123 | $nodeType = $element->nodeType; // 1.Element 2.Attribute 3.Text
124 | //$nodeAttr = $element->getAttribute('src');
125 | //$nodes = util::node_to_array(self::$dom, $element);
126 | //echo $nodes['@src']."\n";
127 | // 如果是img标签,直接取src值
128 | if ($nodeType == 1 && in_array($nodeName, array('img')))
129 | {
130 | $content = $element->getAttribute('src');
131 | }
132 | // 如果是标签属性,直接取节点值
133 | elseif ($nodeType == 2 || $nodeType == 3 || $nodeType == 4)
134 | {
135 | $content = $element->nodeValue;
136 | }
137 | else
138 | {
139 | // 保留nodeValue里的html符号,给children二次提取
140 | $content = self::$dom->saveXml($element);
141 | //$content = trim(self::$dom->saveHtml($element));
142 | $content = preg_replace(array("#^<{$nodeName}.*>#isU","#{$nodeName}>$#isU"), array('', ''), $content);
143 | }
144 | }
145 | $result[] = $content;
146 | }
147 | }
148 | if (empty($result))
149 | {
150 | return null;
151 | }
152 | // 如果只有一个元素就直接返回string,否则返回数组
153 | return count($result) > 1 ? $result : $result[0];
154 | }
155 |
156 | /**
157 | * css选择器
158 | *
159 | * @param mixed $html
160 | * @param mixed $selector
161 | * @return void
162 | * @author seatle
163 | * @created time :2016-10-26 12:53
164 | */
165 | private static function _css_select($html, $selector, $remove = false)
166 | {
167 | $selector = self::css_to_xpath($selector);
168 | //echo $selector."\n";
169 | //exit("\n");
170 | return self::_xpath_select($html, $selector, $remove);
171 | // 如果加载的不是之前的HTML内容,替换一下验证标识
172 | //if (self::$dom_auth['css'] != md5($html))
173 | //{
174 | //self::$dom_auth['css'] = md5($html);
175 | //phpQuery::loadDocumentHTML($html);
176 | //}
177 | //if ($remove)
178 | //{
179 | //return phpQuery::pq($selector)->remove();
180 | //}
181 | //else
182 | //{
183 | //return phpQuery::pq($selector)->html();
184 | //}
185 | }
186 |
187 | /**
188 | * 正则选择器
189 | *
190 | * @param mixed $html
191 | * @param mixed $selector
192 | * @return void
193 | * @author seatle
194 | * @created time :2016-10-26 12:53
195 | */
196 | private static function _regex_select($html, $selector, $remove = false)
197 | {
198 | if(@preg_match_all($selector, $html, $out) === false)
199 | {
200 | self::$error = "the selector in the regex(\"{$selector}\") syntax errors";
201 | return null;
202 | }
203 | $count = count($out);
204 | $result = array();
205 | // 一个都没有匹配到
206 | if ($count == 0)
207 | {
208 | return null;
209 | }
210 | // 只匹配一个,就是只有一个 ()
211 | elseif ($count == 2)
212 | {
213 | // 删除的话取匹配到的所有内容
214 | if ($remove)
215 | {
216 | $result = $out[0];
217 | }
218 | else
219 | {
220 | $result = $out[1];
221 | }
222 | }
223 | else
224 | {
225 | for ($i = 1; $i < $count; $i++)
226 | {
227 | // 如果只有一个元素,就直接返回好了
228 | $result[] = count($out[$i]) > 1 ? $out[$i] : $out[$i][0];
229 | }
230 | }
231 | if (empty($result))
232 | {
233 | return null;
234 | }
235 |
236 | return count($result) > 1 ? $result : $result[0];
237 | }
238 |
239 | public static function find_all($html, $selector)
240 | {
241 | }
242 |
243 |
244 | public static function css_to_xpath($selectors)
245 | {
246 | $queries = self::parse_selector($selectors);
247 | $delimiter_before = false;
248 | $xquery = '';
249 | foreach($queries as $s)
250 | {
251 | // TAG
252 | $is_tag = preg_match('@^[\w|\||-]+$@', $s) || $s == '*';
253 | if ($is_tag)
254 | {
255 | $xquery .= $s;
256 | }
257 | // ID
258 | else if ($s[0] == '#')
259 | {
260 | if ($delimiter_before)
261 | {
262 | $xquery .= '*';
263 | }
264 | // ID用精确查询
265 | $xquery .= "[@id='".substr($s, 1)."']";
266 | }
267 | // CLASSES
268 | else if ($s[0] == '.')
269 | {
270 | if ($delimiter_before)
271 | {
272 | $xquery .= '*';
273 | }
274 | // CLASS用模糊查询
275 | $xquery .= "[contains(@class,'".substr($s, 1)."')]";
276 | }
277 | // ATTRIBUTES
278 | else if ($s[0] == '[')
279 | {
280 | if ($delimiter_before)
281 | {
282 | $xquery .= '*';
283 | }
284 | // strip side brackets
285 | $attr = trim($s, '][');
286 | // attr with specifed value
287 | if (mb_strpos($s, '='))
288 | {
289 | $value = null;
290 | list($attr, $value) = explode('=', $attr);
291 | $value = trim($value, "'\"");
292 | if (self::is_regexp($attr))
293 | {
294 | // cut regexp character
295 | $attr = substr($attr, 0, -1);
296 | $xquery .= "[@{$attr}]";
297 | }
298 | else
299 | {
300 | $xquery .= "[@{$attr}='{$value}']";
301 | }
302 | }
303 | // attr without specified value
304 | else
305 | {
306 | $xquery .= "[@{$attr}]";
307 | }
308 | }
309 | // ~ General Sibling Selector
310 | else if ($s[0] == '~')
311 | {
312 | }
313 | // + Adjacent sibling selectors
314 | else if ($s[0] == '+')
315 | {
316 | }
317 | // PSEUDO CLASSES
318 | else if ($s[0] == ':')
319 | {
320 | }
321 | // DIRECT DESCENDANDS
322 | else if ($s == '>')
323 | {
324 | $xquery .= '/';
325 | $delimiter_before = 2;
326 | }
327 | // ALL DESCENDANDS
328 | else if ($s == ' ')
329 | {
330 | $xquery .= '//';
331 | $delimiter_before = 2;
332 | }
333 | // ERRORS
334 | else
335 | {
336 | exit("Unrecognized token '$s'");
337 | }
338 | $delimiter_before = $delimiter_before === 2;
339 | }
340 | return $xquery;
341 | }
342 |
343 | /**
344 | * @access private
345 | */
346 | public static function parse_selector($query)
347 | {
348 | $query = trim( preg_replace( '@\s+@', ' ', preg_replace('@\s*(>|\\+|~)\s*@', '\\1', $query) ) );
349 | $queries = array();
350 | if ( !$query )
351 | {
352 | return $queries;
353 | }
354 |
355 | $special_chars = array('>',' ');
356 | $special_chars_mapping = array();
357 | $strlen = mb_strlen($query);
358 | $class_chars = array('.', '-');
359 | $pseudo_chars = array('-');
360 | $tag_chars = array('*', '|', '-');
361 | // split multibyte string
362 | // http://code.google.com/p/phpquery/issues/detail?id=76
363 | $_query = array();
364 | for ( $i=0; $i<$strlen; $i++ )
365 | {
366 | $_query[] = mb_substr($query, $i, 1);
367 | }
368 | $query = $_query;
369 | // it works, but i dont like it...
370 | $i = 0;
371 | while( $i < $strlen )
372 | {
373 | $c = $query[$i];
374 | $tmp = '';
375 | // TAG
376 | if ( self::is_char($c) || in_array($c, $tag_chars) )
377 | {
378 | while(isset($query[$i]) && (self::is_char($query[$i]) || in_array($query[$i], $tag_chars)))
379 | {
380 | $tmp .= $query[$i];
381 | $i++;
382 | }
383 | $queries[] = $tmp;
384 | }
385 | // IDs
386 | else if ( $c == '#' )
387 | {
388 | $i++;
389 | while( isset($query[$i]) && (self::is_char($query[$i]) || $query[$i] == '-') )
390 | {
391 | $tmp .= $query[$i];
392 | $i++;
393 | }
394 | $queries[] = '#'.$tmp;
395 | }
396 | // SPECIAL CHARS
397 | else if ( in_array($c, $special_chars) )
398 | {
399 | $queries[] = $c;
400 | $i++;
401 | // MAPPED SPECIAL MULTICHARS
402 | // } else if ( $c.$query[$i+1] == '//') {
403 | // $return[] = ' ';
404 | // $i = $i+2;
405 | }
406 | // MAPPED SPECIAL CHARS
407 | else if ( isset($special_chars_mapping[$c]))
408 | {
409 | $queries[] = $special_chars_mapping[$c];
410 | $i++;
411 | }
412 | // COMMA
413 | else if ( $c == ',' )
414 | {
415 | $i++;
416 | while( isset($query[$i]) && $query[$i] == ' ')
417 | {
418 | $i++;
419 | }
420 | }
421 | // CLASSES
422 | else if ($c == '.')
423 | {
424 | while( isset($query[$i]) && (self::is_char($query[$i]) || in_array($query[$i], $class_chars)))
425 | {
426 | $tmp .= $query[$i];
427 | $i++;
428 | }
429 | $queries[] = $tmp;
430 | }
431 | // ~ General Sibling Selector
432 | else if ($c == '~')
433 | {
434 | $space_allowed = true;
435 | $tmp .= $query[$i++];
436 | while( isset($query[$i])
437 | && (self::is_char($query[$i])
438 | || in_array($query[$i], $class_chars)
439 | || $query[$i] == '*'
440 | || ($query[$i] == ' ' && $space_allowed)
441 | ))
442 | {
443 | if ($query[$i] != ' ')
444 | {
445 | $space_allowed = false;
446 | }
447 | $tmp .= $query[$i];
448 | $i++;
449 | }
450 | $queries[] = $tmp;
451 | }
452 | // + Adjacent sibling selectors
453 | else if ($c == '+')
454 | {
455 | $space_allowed = true;
456 | $tmp .= $query[$i++];
457 | while( isset($query[$i])
458 | && (self::is_char($query[$i])
459 | || in_array($query[$i], $class_chars)
460 | || $query[$i] == '*'
461 | || ($space_allowed && $query[$i] == ' ')
462 | ))
463 | {
464 | if ($query[$i] != ' ')
465 | $space_allowed = false;
466 | $tmp .= $query[$i];
467 | $i++;
468 | }
469 | $queries[] = $tmp;
470 | }
471 | // ATTRS
472 | else if ($c == '[')
473 | {
474 | $stack = 1;
475 | $tmp .= $c;
476 | while( isset($query[++$i]))
477 | {
478 | $tmp .= $query[$i];
479 | if ( $query[$i] == '[')
480 | {
481 | $stack++;
482 | }
483 | else if ( $query[$i] == ']')
484 | {
485 | $stack--;
486 | if (! $stack )
487 | {
488 | break;
489 | }
490 | }
491 | }
492 | $queries[] = $tmp;
493 | $i++;
494 | }
495 | // PSEUDO CLASSES
496 | else if ($c == ':')
497 | {
498 | $stack = 1;
499 | $tmp .= $query[$i++];
500 | while( isset($query[$i]) && (self::is_char($query[$i]) || in_array($query[$i], $pseudo_chars)))
501 | {
502 | $tmp .= $query[$i];
503 | $i++;
504 | }
505 | // with arguments ?
506 | if ( isset($query[$i]) && $query[$i] == '(')
507 | {
508 | $tmp .= $query[$i];
509 | $stack = 1;
510 | while( isset($query[++$i]))
511 | {
512 | $tmp .= $query[$i];
513 | if ( $query[$i] == '(')
514 | {
515 | $stack++;
516 | }
517 | else if ( $query[$i] == ')')
518 | {
519 | $stack--;
520 | if (! $stack )
521 | {
522 | break;
523 | }
524 | }
525 | }
526 | $queries[] = $tmp;
527 | $i++;
528 | }
529 | else
530 | {
531 | $queries[] = $tmp;
532 | }
533 | }
534 | else
535 | {
536 | $i++;
537 | }
538 | }
539 |
540 | if (isset($queries[0]))
541 | {
542 | if (isset($queries[0][0]) && $queries[0][0] == ':')
543 | {
544 | array_unshift($queries, '*');
545 | }
546 | if ($queries[0] != '>')
547 | {
548 | array_unshift($queries, ' ');
549 | }
550 | }
551 |
552 | return $queries;
553 | }
554 |
555 | public static function is_char($char)
556 | {
557 | return preg_match('@\w@', $char);
558 | }
559 |
560 | /**
561 | * 模糊匹配
562 | * ^ 前缀字符串
563 | * * 包含字符串
564 | * $ 后缀字符串
565 | * @access private
566 | */
567 | protected static function is_regexp($pattern)
568 | {
569 | return in_array(
570 | $pattern[ mb_strlen($pattern)-1 ],
571 | array('^','*','$')
572 | );
573 | }
574 | }
575 |
576 | ?>
--------------------------------------------------------------------------------
/ChaoxingSign/main.php:
--------------------------------------------------------------------------------
1 | 1){
61 | die("[已尝试重新登录2次]获取课程列表失败,请稍后再试。多次出现此问题请提交 Issues".PHP_EOL);
62 | }else{
63 | $tryLogin += 1;
64 | echo "[getCourseList]获取课程列表失败,可能是 cookie 过期,正在尝试第{$tryLogin}次重新登录".PHP_EOL;
65 | goto takeLogin;//执行登录,更新 cookie
66 | }
67 | }
68 |
69 | $course_list = [];
70 | foreach ($getCourseListRes['channelList'] as $v){
71 | //TODO: 后续再考虑字段可能不存在的情况,能用就行
72 | /*
73 | $title = '未知课程名';
74 | $teacherName = '未知教师名';
75 |
76 | if(isset($v['content']['course']['data'][0])){
77 | if(isset($v['content']['course']['data'][0]['name'])){
78 | $title = $v['content']['course']['data'][0]['name'];
79 | }
80 | if(isset($v['content']['course']['data'][0]['teacherfactor'])){
81 | $teacherName = $v['content']['course']['data'][0]['teacherfactor'];
82 | }
83 | }
84 | */
85 |
86 | if(!isset($v['content']['course']['data'][0]['id'])) continue;
87 |
88 | $course_list[] = [
89 | 'courseId' => $v['content']['course']['data'][0]['id'],
90 | 'classId' => $v['content']['id'],
91 | 'title' => $v['content']['course']['data'][0]['name'],
92 | 'teacherName' => $v['content']['course']['data'][0]['teacherfactor'],
93 | ];
94 | }
95 |
96 | goto getTaskID;//获取任务 ID
97 |
98 |
99 |
100 | //获取任务ID
101 | getTaskID:
102 | $taskID = [];
103 | foreach ($course_list as $val) {
104 | $html = curl_get(sprintf(TASK_ID, $val['courseId'], $val['classId']), $jar_path, "phone");
105 | $res = json_decode($html, true)["activeList"];
106 | // 由于同一时间同一门课不会出现多个签到,优化遍历代码
107 | for ($i = 0; $i <= 3; $i ++){
108 | if($res[$i]["status"] == 1 && $res[$i]["activeType"] ==2){
109 | $taskID[] = [
110 | $val['courseId'],//课程ID
111 | $val['classId'],//班级ID
112 | $res[$i]["id"],//签到任务ID
113 | $val['title'],//课程名
114 | $val['teacherName'],//教师名
115 | ];
116 | }
117 | }
118 | // 数组全部遍历
119 | // foreach ($res as $k => $v) {
120 | // if($v["status"] == 1){
121 | // $taskID[] = [
122 | // $val['courseId'],//课程ID
123 | // $val['classId'],//班级ID
124 | // $v["id"],//签到任务ID
125 | // $val['title'],//课程名
126 | // $val['teacherName'],//教师名
127 | // ];
128 | // }
129 | // }
130 | }
131 |
132 | if (count($taskID) > 0) {
133 |
134 | if (!file_exists($signed_path)) {
135 | file_put_contents($signed_path, "#新建一个 已经签到完的活动 文件");
136 | }
137 |
138 | goto doTask;
139 | }
140 |
141 | file_put_contents($signed_path, "");//没有签到任务了,将其置为空
142 | echo "[getTaskID]没有待签到的任务".PHP_EOL;
143 | //file_put_contents("logs/logs.log","【".date("Y-m-d H:i:s")."】"."没有待签到的任务".PHP_EOL);
144 | die;
145 |
146 |
147 | //执行任务
148 | doTask:
149 | $activeBlackList = explode("\n", file_get_contents($signed_path));
150 |
151 | $msgTmp = "";
152 | foreach ($taskID as $k => $v) {
153 |
154 | //该签到任务已经签到了,不需要再次重复签到
155 | if(in_array($v[2], $activeBlackList)) continue;
156 |
157 | echo $_1 = "正在签到:{$v[4]}@{$v[3]}";
158 |
159 | // 预签到
160 | $preSignRes = trim(curl_get(sprintf(PRE_SIGN_API, $v[0], $v[1], $v[2]), $jar_path));
161 |
162 | // 位置签到的正则匹配
163 | $locationLatitude_gd_re = '/locationLatitude" value="(\d+?\.\d+?)">/';
164 | $locationLongitude_gd_re = '/locationLongitude" value="(\d+?\.\d+?)">/';
165 | $locationAddress_re = '/locationText" value="(.+?)">/';
166 | $isGPSRequired = preg_match($locationLatitude_gd_re,$preSignRes,$latitude_res);
167 | preg_match($locationLongitude_gd_re,$preSignRes,$longitude_res);
168 | preg_match($locationAddress_re,$preSignRes,$address_res);
169 | // 正式签到
170 | if ($isGPSRequired){
171 | $signRes = trim(curl_get(sprintf(SIGN_API_WITH_GPS, $v[2],$latitude_res[1],$longitude_res[1],$longitude_res[1],$latitude_res[1],urlencode($address_res[1])), $jar_path));//签到结果
172 | }else{
173 | $signRes = trim(curl_get(sprintf(SIGN_API, $v[2]), $jar_path));//签到结果
174 | }
175 |
176 |
177 |
178 | echo $_2 = PHP_EOL."[".date("Y-m-d H:i:s")."]";
179 | if($signRes === "success" || $signRes === "您已签到过了"){
180 | //该签到加入 签到黑名单,以避免重复签到
181 | file_put_contents($signed_path, "\n".$v[2], FILE_APPEND);
182 | echo $_3 = str_replace("success", "签到成功", $signRes).PHP_EOL.PHP_EOL;
183 | }else{
184 | echo $_3 = "签到失败,错误原因:{$signRes}".PHP_EOL;
185 | }
186 |
187 | $msgTmp .= $_1.$_2.$_3;
188 | }
189 |
190 | //检查是否包含签到成功,如果包含签到成功 || 签到失败
191 | //则进行推送
192 | if(strpos($msgTmp,'签到成功') !== false || strpos($msgTmp,'签到失败') !== false){
193 |
194 | //Server酱 微信推送
195 | //先检查是否开启推送 以及 是否配置了“Server酱”相关信息
196 | if(SERVER_CHAN_STATE && isset($config['SERVER_CHAN'][strval($account)])){
197 | //再检查是否开启了推送
198 | if($config['SERVER_CHAN'][$account]['state']){
199 | $req = sc_send(
200 | "超星自动签到成功",
201 | str_replace("\n", "\n\n", $msgTmp),//因为 Server酱 两个换行才是换行
202 | $config['SERVER_CHAN'][$account]['SendKey']
203 | );
204 |
205 | if(!isset($req['errmsg'])){
206 | die("Server酱 推送失败,可能是你没有配置 SCKEY,请检查".PHP_EOL);
207 | }
208 |
209 | if($req['errmsg'] === 'success'){
210 | echo "Server酱 消息推送成功".PHP_EOL;
211 | }else{
212 | echo "Server酱 消息推送失败,原因:{$req['errmsg']}".PHP_EOL;
213 | }
214 | }
215 | }else{
216 | //echo "未配置 Server酱,不推送消息".PHP_EOL;
217 | }
218 |
219 | //Telegram 推送
220 | //先检查是否开启推送 以及 是否配置了“Telegram BOT”相关信息
221 | if(TG_STATE && isset($config['Telegram'][strval($account)])){
222 | if($config['Telegram'][$account]['state']){
223 | $req = tg_send(
224 | $config['Telegram'][$account]['TG_CHAT_ID'],
225 | $msgTmp = "超星自动签到成功\n\n" . $msgTmp ,
226 | $config['Telegram'][$account]['TG_BOT_TOKEN']
227 | );
228 | if($req['ok'] == true){
229 | echo "Telegram 消息推送成功".PHP_EOL;
230 | }else{
231 | echo "Telegram 消息推送失败。".PHP_EOL;
232 | }
233 | }
234 | }else{
235 | //echo "未配置 Telegram BOT,不推送消息".PHP_EOL;
236 | }
237 |
238 | //BARK 推送
239 | //先检查是否开启推送 以及 是否配置了“BARK”相关信息
240 | if(BARK_STATE && isset($config['Bark'][strval($account)])){
241 | if($config['Bark'][$account]['state']){
242 | $req = bark_send(
243 | "超星自动签到提醒",
244 | $msgTmp = "超星自动签到成功\n\n" . $msgTmp,
245 | $config['Bark'][$account]['BARK_PUSH_API']
246 | );
247 | if($req['code'] == 200){
248 | echo "Bark 消息推送成功".PHP_EOL;
249 | }else{
250 | echo "Bark 消息推送失败。".PHP_EOL;
251 | }
252 | }
253 | }else{
254 | //echo "未配置 Bark,不推送消息".PHP_EOL;
255 | }
256 | //Go-cqhttp 推送
257 | //先检查是否开启推送 以及 是否配置了“”相关信息
258 | if(Go_cqhttp_STATE && isset($config['Go-cqhttp'][strval($account)])){
259 | if($config['Go-cqhttp'][$account]['state']){
260 | $req = Go_cqhttp_send(
261 | $config['Go-cqhttp'][$account]['QQ'],
262 | $msgTmp = "超星自动签到成功\n\n" . $msgTmp ,
263 | $config['Go-cqhttp'][$account]['API'],
264 | $config['Go-cqhttp'][$account]['access-token']
265 | );
266 | if($req['status'] == 'ok'){
267 | echo "Go-cqhttp 消息推送成功".PHP_EOL;
268 | }else{
269 | echo "Go-cqhttp 消息推送失败。".PHP_EOL;
270 | }
271 | }
272 | }else{
273 | //echo "未配置 Go-cqhttp,不推送消息".PHP_EOL;
274 | }
275 | }else{
276 | echo "没有待签到的任务".PHP_EOL;
277 | }
278 | die;
279 |
280 |
281 | //登陆账号
282 | takeLogin:
283 | $login_data = json_decode(curl_get(sprintf(LOGIN_API, $account, $password), $jar_path), true);
284 |
285 | if (!isset($login_data['status'])) {
286 | die("登陆失败,原因:API 错误,请再次尝试。多次出现此问题请提交 Issues".PHP_EOL);
287 | }
288 |
289 | if($login_data['status'] !== true){
290 | unlink($jar_path);//删除临时创建的 cookie 文件,避免产生大量的垃圾文件
291 | die("登陆失败,原因:{$login_data['mes']}".PHP_EOL);
292 | }
293 |
294 | echo "登陆成功,正在尝试签到...".PHP_EOL;
295 | goto getCourseList;//获取课程列表
296 |
297 | ?>
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Chuwen
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ⭐ ChaoxingSign | 超星学习通签到
2 | PHP 版超星学习用自动签到,支持多用户签到,二次开发便捷!
3 |
4 | `PHP 7.3` 测试通过,理应 `PHP 5.4` 及以上都能够使用
5 |
6 | - 登录方式:
7 |
8 | 支持手机号码登录,暂时不支持学号登陆!!!
9 |
10 | - 签到功能:
11 |
12 | 支持普通签到,手势签到,~~二维码签到~~,位置签到,拍照签到(无图片上传)
13 |
14 | # 🎨 更新日志
15 |
16 | 2023/2/12
17 |
18 | - 增加了docker-compose运行的支持,运行`run-docker.sh`即可完成一键部署
19 |
20 | 2022/12/23
21 |
22 | - 增加Go-cqhttp推送,需要配置 config.php 文件
23 | - 支持直接在config.php文件配置账号和密码(单用户使用)
24 | - 默认设置了周六周日不签到
25 |
26 | 2022/08/29
27 |
28 | - 修复无法登录的Bug
29 | - 修复无法位置签到的Bug
30 | - 调整了curl的实现方法,方便后期debug
31 |
32 |
33 | 2022/06/06
34 |
35 | - 增加预签到
36 | - 修复无法签到的Bug
37 |
38 |
39 | 2022/04/27
40 |
41 | - 新增 Bark 推送
42 | > Bark API的末尾不需要添加 /
43 | - 修复获取课程失败导致签到失败的Bug
44 | - 优化签到效率
45 |
46 |
47 | 2021/03/21
48 |
49 | - #6 升级为新版 Server 酱推送通道,原因:微信发布公告将在2021年4月底下线模板消息,故旧版推送通道将于 2021年4月 下线
50 | > 获取本源码后,请配置 `Config.php` 的相关配置
51 |
52 |
53 |
54 | 2020/06/13
55 |
56 | - 修复 #2 的问题,配置了 Server酱但不推送的问题
57 | - 更改 判断时间区间的方法
58 | - 添加 获取课程列表失败,重试2次以判断是API错误
59 |
60 |
61 |
62 | 2020/05/27
63 |
64 | - 修复 #1
65 | - 更改 获取课程、签到 API
66 | - 添加 手势、位置、二维码一键签到
67 | - 添加 Server酱 微信推送,需要配置 `config.php` 文件
68 |
69 |
70 |
71 | 2020/05/25
72 |
73 | - 更改 登录接口,原接口已经失效
74 |
75 |
76 | # 🎁 TODO
77 | - [] 接入钉钉机器人 API
78 |
79 | # 🧀 使用方法
80 | 1. 下载源码:
81 |
82 | 直接下载:https://github.com/xiwangly2/ChaoxingSign/archive/master.zip
83 |
84 | 克隆源码:`git clone https://github.com/xiwangly2/ChaoxingSign.git`
85 |
86 | 2. 🚀 运行
87 | 1. 上传到**网站根目录**运行
88 |
89 | 然后访问 `http://你的域名/main.php?account=你的超星账号&password=你的超星密码`
90 |
91 | 2. 或者使用**命令行**运行
92 | ```
93 | php main.php -A "你的超星账号" -P "你的超星密码"
94 | ```
95 |
96 | 3. ⚙ 实现自动签到
97 | > 推荐大于等于 **10 分钟** 执行一次,避免出现异常
98 | >
99 | > 我已经硬编仅能在每天的 08:00 ~ 22:00 之间运行,
100 | > 如果要取消或修改这一限制,请删除或注释
101 | > `main.php` 第 7~9 行
102 | 1. 如果以**网页方式**运行,定时监控 `http://你的域名/main.php?account=你的超星账号&password=你的超星密码` 即可
103 | 2. 如果使用**命令行方式**运行,添加 `crontab` 任务即可,具体添加 `crontab 任务` 方法可以网上搜。
104 | 每天 早上8点到晚上22点之间,每10分钟签到一次 crontab 表达式:`0 */10 8-22 * * * *`
105 |
106 | # √ 运行输出
107 | 签到成功:
108 | ```
109 | 正在签到:陈半仙@测试班级
110 | [2020-06-13 11:44:14]签到成功
111 |
112 | Server酱 消息推送成功
113 | ```
114 |
115 | 没有签到任务:
116 | ```
117 | 没有待签到的任务
118 | ```
119 |
120 | # ❗ 注意
121 | 超星**可能**屏蔽了如 阿里云、腾讯云、百度云... 等 IDC IP 地址,故有可能出现未知的错误(我没测试,我仅在家庭宽带中测试成功)
122 |
123 | # 🙇 感谢
124 | > 本项目的实现参考了以下文章
125 |
126 | - https://www.z2blog.com/index.php/learn/423.html
127 | - https://www.z2blog.com/index.php/default/459.html
128 |
129 | > 本项目中使用到的 `Selector.php` 来自 [PHPSpider](https://github.com/owner888/phpspider)
130 |
131 | # License
132 | 遵循 [MIT License](./LICENSE) 协议
133 |
134 | ## 其它版本签到脚本推荐
135 | > 排名不分先后
136 |
137 | | 项目地址 | 开发语言 | 备注 |
138 | | ------------------------------------------------------- | ---------- | ------------------------------------------ |
139 | | https://github.com/mkdir700/chaoxing_auto_sign | Python | 超星学习通自动签到脚本&多用户多任务&API |
140 | | https://github.com/Wzb3422/auto-sign-chaoxing | TypeScript | 超星学习通自动签到,梦中刷网课 |
141 | | https://github.com/aihuahua-522/chaoxing-testforAndroid | Java | 学习通(超星)自动签到 |
142 | | https://github.com/yuban10703/chaoxingsign | Python | 超星学习通自动签到 |
143 | | https://github.com/Huangyan0804/AutoCheckin | Python | 学习通自动签到,支持手势,二维码,位置,拍照等 |
144 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: "3"
2 | services:
3 |
4 | php-fpm:
5 | container_name: "php-fpm"
6 | restart: always
7 | image: php:7.4.33-fpm-alpine
8 | environment:
9 | TZ: "Asia/Shanghai"
10 | # links:
11 | # - "go-cqhttp"
12 | volumes:
13 | - "/www/wwwroot/website:/usr/share/nginx/html"
14 | - "/www/wwwroot/config/www.conf:/usr/local/etc/php-fpm.d/www.conf"
15 | - "/www/wwwroot/config/php.ini:/usr/local/etc/php/php.ini"
16 |
17 | nginx:
18 | image: nginx:1.23.3
19 | container_name: "nginx"
20 | restart: always
21 | ports:
22 | - "80:80"
23 | - "443:443"
24 | links:
25 | - "php-fpm"
26 | environment:
27 | TZ: "Asia/Shanghai"
28 | volumes:
29 | - "/www/wwwroot/website:/usr/share/nginx/html"
30 | - "/www/wwwroot/config/default.conf:/etc/nginx/conf.d/default.conf"
31 |
32 | # go-cqhttp:
33 | # image: xiwangly/go-cqhttp:arm64
34 | # container_name: "go-cqhttp"
35 | # restart: always
36 | # ports:
37 | # - "5700:5700"
38 | # environment:
39 | # TZ: "Asia/Shanghai"
40 | # volumes:
41 | # - "/www/wwwroot/go-cqhttp:/go-cqhttp"
42 | # stdin_open: true
43 | # tty: true
44 |
--------------------------------------------------------------------------------
/run-docker.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | # dependence list: curl, cron, docker-compose,docker
3 | # 此脚本只需执行一次
4 | cd .;
5 | mkdir -p /www/wwwroot/website;
6 | cp -r www/wwwroot/config /www/wwwroot;
7 | cp -r ChaoxingSign /www/wwwroot/website;
8 | docker-compose up -d;
9 | echo '*/3 * * * * /usr/bin/curl "http://localhost/ChaoxingSign/main.php?account=&password=" > /dev/null 2>&1' > /var/spool/cron/crontabs/root;
10 | systemctl restart cron;
11 |
--------------------------------------------------------------------------------
/www/wwwroot/config/default.conf:
--------------------------------------------------------------------------------
1 | server {
2 | listen 80;
3 | listen [::]:80;
4 | server_name localhost;
5 |
6 | #access_log /var/log/nginx/host.access.log main;
7 |
8 | location / {
9 | root /usr/share/nginx/html;
10 | index index.php index.html index.htm;
11 | }
12 |
13 | error_page 404 /404.html;
14 |
15 | # redirect server error pages to the static page /50x.html
16 | #
17 | error_page 500 502 503 504 /50x.html;
18 | location = /50x.html {
19 | root /usr/share/nginx/html;
20 | }
21 |
22 | # proxy the PHP scripts to Apache listening on 127.0.0.1:80
23 | #
24 | #location ~ \.php$ {
25 | # proxy_pass http://127.0.0.1;
26 | #}
27 |
28 | # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
29 | #
30 | location ~ \.php$ {
31 | root /usr/share/nginx/html;
32 | fastcgi_pass php-fpm:9000;
33 | fastcgi_index index.php;
34 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
35 | include fastcgi_params;
36 | }
37 |
38 | # deny access to .htaccess files, if Apache's document root
39 | # concurs with nginx's one
40 | #
41 | #location ~ /\.ht {
42 | # deny all;
43 | #}
44 | }
45 |
46 |
--------------------------------------------------------------------------------
/www/wwwroot/config/php.ini:
--------------------------------------------------------------------------------
1 | [PHP]
2 |
3 | ;;;;;;;;;;;;;;;;;;;
4 | ; About php.ini ;
5 | ;;;;;;;;;;;;;;;;;;;
6 | ; PHP's initialization file, generally called php.ini, is responsible for
7 | ; configuring many of the aspects of PHP's behavior.
8 |
9 | ; PHP attempts to find and load this configuration from a number of locations.
10 | ; The following is a summary of its search order:
11 | ; 1. SAPI module specific location.
12 | ; 2. The PHPRC environment variable.
13 | ; 3. A number of predefined registry keys on Windows
14 | ; 4. Current working directory (except CLI)
15 | ; 5. The web server's directory (for SAPI modules), or directory of PHP
16 | ; (otherwise in Windows)
17 | ; 6. The directory from the --with-config-file-path compile time option, or the
18 | ; Windows directory (usually C:\windows)
19 | ; See the PHP docs for more specific information.
20 | ; https://php.net/configuration.file
21 |
22 | ; The syntax of the file is extremely simple. Whitespace and lines
23 | ; beginning with a semicolon are silently ignored (as you probably guessed).
24 | ; Section headers (e.g. [Foo]) are also silently ignored, even though
25 | ; they might mean something in the future.
26 |
27 | ; Directives following the section heading [PATH=/www/mysite] only
28 | ; apply to PHP files in the /www/mysite directory. Directives
29 | ; following the section heading [HOST=www.example.com] only apply to
30 | ; PHP files served from www.example.com. Directives set in these
31 | ; special sections cannot be overridden by user-defined INI files or
32 | ; at runtime. Currently, [PATH=] and [HOST=] sections only work under
33 | ; CGI/FastCGI.
34 | ; https://php.net/ini.sections
35 |
36 | ; Directives are specified using the following syntax:
37 | ; directive = value
38 | ; Directive names are *case sensitive* - foo=bar is different from FOO=bar.
39 | ; Directives are variables used to configure PHP or PHP extensions.
40 | ; There is no name validation. If PHP can't find an expected
41 | ; directive because it is not set or is mistyped, a default value will be used.
42 |
43 | ; The value can be a string, a number, a PHP constant (e.g. E_ALL or M_PI), one
44 | ; of the INI constants (On, Off, True, False, Yes, No and None) or an expression
45 | ; (e.g. E_ALL & ~E_NOTICE), a quoted string ("bar"), or a reference to a
46 | ; previously set variable or directive (e.g. ${foo})
47 |
48 | ; Expressions in the INI file are limited to bitwise operators and parentheses:
49 | ; | bitwise OR
50 | ; ^ bitwise XOR
51 | ; & bitwise AND
52 | ; ~ bitwise NOT
53 | ; ! boolean NOT
54 |
55 | ; Boolean flags can be turned on using the values 1, On, True or Yes.
56 | ; They can be turned off using the values 0, Off, False or No.
57 |
58 | ; An empty string can be denoted by simply not writing anything after the equal
59 | ; sign, or by using the None keyword:
60 |
61 | ; foo = ; sets foo to an empty string
62 | ; foo = None ; sets foo to an empty string
63 | ; foo = "None" ; sets foo to the string 'None'
64 |
65 | ; If you use constants in your value, and these constants belong to a
66 | ; dynamically loaded extension (either a PHP extension or a Zend extension),
67 | ; you may only use these constants *after* the line that loads the extension.
68 |
69 | ;;;;;;;;;;;;;;;;;;;
70 | ; About this file ;
71 | ;;;;;;;;;;;;;;;;;;;
72 | ; PHP comes packaged with two INI files. One that is recommended to be used
73 | ; in production environments and one that is recommended to be used in
74 | ; development environments.
75 |
76 | ; php.ini-production contains settings which hold security, performance and
77 | ; best practices at its core. But please be aware, these settings may break
78 | ; compatibility with older or less security conscience applications. We
79 | ; recommending using the production ini in production and testing environments.
80 |
81 | ; php.ini-development is very similar to its production variant, except it is
82 | ; much more verbose when it comes to errors. We recommend using the
83 | ; development version only in development environments, as errors shown to
84 | ; application users can inadvertently leak otherwise secure information.
85 |
86 | ; This is the php.ini-production INI file.
87 |
88 | ;;;;;;;;;;;;;;;;;;;
89 | ; Quick Reference ;
90 | ;;;;;;;;;;;;;;;;;;;
91 |
92 | ; The following are all the settings which are different in either the production
93 | ; or development versions of the INIs with respect to PHP's default behavior.
94 | ; Please see the actual settings later in the document for more details as to why
95 | ; we recommend these changes in PHP's behavior.
96 |
97 | ; display_errors
98 | ; Default Value: On
99 | ; Development Value: On
100 | ; Production Value: Off
101 |
102 | ; display_startup_errors
103 | ; Default Value: On
104 | ; Development Value: On
105 | ; Production Value: Off
106 |
107 | ; error_reporting
108 | ; Default Value: E_ALL
109 | ; Development Value: E_ALL
110 | ; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
111 |
112 | ; log_errors
113 | ; Default Value: Off
114 | ; Development Value: On
115 | ; Production Value: On
116 |
117 | ; max_input_time
118 | ; Default Value: -1 (Unlimited)
119 | ; Development Value: 60 (60 seconds)
120 | ; Production Value: 60 (60 seconds)
121 |
122 | ; output_buffering
123 | ; Default Value: Off
124 | ; Development Value: 4096
125 | ; Production Value: 4096
126 |
127 | ; register_argc_argv
128 | ; Default Value: On
129 | ; Development Value: Off
130 | ; Production Value: Off
131 |
132 | ; request_order
133 | ; Default Value: None
134 | ; Development Value: "GP"
135 | ; Production Value: "GP"
136 |
137 | ; session.gc_divisor
138 | ; Default Value: 100
139 | ; Development Value: 1000
140 | ; Production Value: 1000
141 |
142 | ; session.sid_bits_per_character
143 | ; Default Value: 4
144 | ; Development Value: 5
145 | ; Production Value: 5
146 |
147 | ; short_open_tag
148 | ; Default Value: On
149 | ; Development Value: Off
150 | ; Production Value: Off
151 |
152 | ; variables_order
153 | ; Default Value: "EGPCS"
154 | ; Development Value: "GPCS"
155 | ; Production Value: "GPCS"
156 |
157 | ; zend.exception_ignore_args
158 | ; Default Value: Off
159 | ; Development Value: Off
160 | ; Production Value: On
161 |
162 | ; zend.exception_string_param_max_len
163 | ; Default Value: 15
164 | ; Development Value: 15
165 | ; Production Value: 0
166 |
167 | ;;;;;;;;;;;;;;;;;;;;
168 | ; php.ini Options ;
169 | ;;;;;;;;;;;;;;;;;;;;
170 | ; Name for user-defined php.ini (.htaccess) files. Default is ".user.ini"
171 | ;user_ini.filename = ".user.ini"
172 |
173 | ; To disable this feature set this option to an empty value
174 | ;user_ini.filename =
175 |
176 | ; TTL for user-defined php.ini files (time-to-live) in seconds. Default is 300 seconds (5 minutes)
177 | ;user_ini.cache_ttl = 300
178 |
179 | ;;;;;;;;;;;;;;;;;;;;
180 | ; Language Options ;
181 | ;;;;;;;;;;;;;;;;;;;;
182 |
183 | ; Enable the PHP scripting language engine under Apache.
184 | ; https://php.net/engine
185 | engine = On
186 |
187 | ; This directive determines whether or not PHP will recognize code between
188 | ; and ?> tags as PHP source which should be processed as such. It is
189 | ; generally recommended that should be used and that this feature
190 | ; should be disabled, as enabling it may result in issues when generating XML
191 | ; documents, however this remains supported for backward compatibility reasons.
192 | ; Note that this directive does not control the = shorthand tag, which can be
193 | ; used regardless of this directive.
194 | ; Default Value: On
195 | ; Development Value: Off
196 | ; Production Value: Off
197 | ; https://php.net/short-open-tag
198 | short_open_tag = Off
199 |
200 | ; The number of significant digits displayed in floating point numbers.
201 | ; https://php.net/precision
202 | precision = 14
203 |
204 | ; Output buffering is a mechanism for controlling how much output data
205 | ; (excluding headers and cookies) PHP should keep internally before pushing that
206 | ; data to the client. If your application's output exceeds this setting, PHP
207 | ; will send that data in chunks of roughly the size you specify.
208 | ; Turning on this setting and managing its maximum buffer size can yield some
209 | ; interesting side-effects depending on your application and web server.
210 | ; You may be able to send headers and cookies after you've already sent output
211 | ; through print or echo. You also may see performance benefits if your server is
212 | ; emitting less packets due to buffered output versus PHP streaming the output
213 | ; as it gets it. On production servers, 4096 bytes is a good setting for performance
214 | ; reasons.
215 | ; Note: Output buffering can also be controlled via Output Buffering Control
216 | ; functions.
217 | ; Possible Values:
218 | ; On = Enabled and buffer is unlimited. (Use with caution)
219 | ; Off = Disabled
220 | ; Integer = Enables the buffer and sets its maximum size in bytes.
221 | ; Note: This directive is hardcoded to Off for the CLI SAPI
222 | ; Default Value: Off
223 | ; Development Value: 4096
224 | ; Production Value: 4096
225 | ; https://php.net/output-buffering
226 | output_buffering = 4096
227 |
228 | ; You can redirect all of the output of your scripts to a function. For
229 | ; example, if you set output_handler to "mb_output_handler", character
230 | ; encoding will be transparently converted to the specified encoding.
231 | ; Setting any output handler automatically turns on output buffering.
232 | ; Note: People who wrote portable scripts should not depend on this ini
233 | ; directive. Instead, explicitly set the output handler using ob_start().
234 | ; Using this ini directive may cause problems unless you know what script
235 | ; is doing.
236 | ; Note: You cannot use both "mb_output_handler" with "ob_iconv_handler"
237 | ; and you cannot use both "ob_gzhandler" and "zlib.output_compression".
238 | ; Note: output_handler must be empty if this is set 'On' !!!!
239 | ; Instead you must use zlib.output_handler.
240 | ; https://php.net/output-handler
241 | ;output_handler =
242 |
243 | ; URL rewriter function rewrites URL on the fly by using
244 | ; output buffer. You can set target tags by this configuration.
245 | ; "form" tag is special tag. It will add hidden input tag to pass values.
246 | ; Refer to session.trans_sid_tags for usage.
247 | ; Default Value: "form="
248 | ; Development Value: "form="
249 | ; Production Value: "form="
250 | ;url_rewriter.tags
251 |
252 | ; URL rewriter will not rewrite absolute URL nor form by default. To enable
253 | ; absolute URL rewrite, allowed hosts must be defined at RUNTIME.
254 | ; Refer to session.trans_sid_hosts for more details.
255 | ; Default Value: ""
256 | ; Development Value: ""
257 | ; Production Value: ""
258 | ;url_rewriter.hosts
259 |
260 | ; Transparent output compression using the zlib library
261 | ; Valid values for this option are 'off', 'on', or a specific buffer size
262 | ; to be used for compression (default is 4KB)
263 | ; Note: Resulting chunk size may vary due to nature of compression. PHP
264 | ; outputs chunks that are few hundreds bytes each as a result of
265 | ; compression. If you prefer a larger chunk size for better
266 | ; performance, enable output_buffering in addition.
267 | ; Note: You need to use zlib.output_handler instead of the standard
268 | ; output_handler, or otherwise the output will be corrupted.
269 | ; https://php.net/zlib.output-compression
270 | zlib.output_compression = Off
271 |
272 | ; https://php.net/zlib.output-compression-level
273 | ;zlib.output_compression_level = -1
274 |
275 | ; You cannot specify additional output handlers if zlib.output_compression
276 | ; is activated here. This setting does the same as output_handler but in
277 | ; a different order.
278 | ; https://php.net/zlib.output-handler
279 | ;zlib.output_handler =
280 |
281 | ; Implicit flush tells PHP to tell the output layer to flush itself
282 | ; automatically after every output block. This is equivalent to calling the
283 | ; PHP function flush() after each and every call to print() or echo() and each
284 | ; and every HTML block. Turning this option on has serious performance
285 | ; implications and is generally recommended for debugging purposes only.
286 | ; https://php.net/implicit-flush
287 | ; Note: This directive is hardcoded to On for the CLI SAPI
288 | implicit_flush = Off
289 |
290 | ; The unserialize callback function will be called (with the undefined class'
291 | ; name as parameter), if the unserializer finds an undefined class
292 | ; which should be instantiated. A warning appears if the specified function is
293 | ; not defined, or if the function doesn't include/implement the missing class.
294 | ; So only set this entry, if you really want to implement such a
295 | ; callback-function.
296 | unserialize_callback_func =
297 |
298 | ; The unserialize_max_depth specifies the default depth limit for unserialized
299 | ; structures. Setting the depth limit too high may result in stack overflows
300 | ; during unserialization. The unserialize_max_depth ini setting can be
301 | ; overridden by the max_depth option on individual unserialize() calls.
302 | ; A value of 0 disables the depth limit.
303 | ;unserialize_max_depth = 4096
304 |
305 | ; When floats & doubles are serialized, store serialize_precision significant
306 | ; digits after the floating point. The default value ensures that when floats
307 | ; are decoded with unserialize, the data will remain the same.
308 | ; The value is also used for json_encode when encoding double values.
309 | ; If -1 is used, then dtoa mode 0 is used which automatically select the best
310 | ; precision.
311 | serialize_precision = -1
312 |
313 | ; open_basedir, if set, limits all file operations to the defined directory
314 | ; and below. This directive makes most sense if used in a per-directory
315 | ; or per-virtualhost web server configuration file.
316 | ; Note: disables the realpath cache
317 | ; https://php.net/open-basedir
318 | ;open_basedir =
319 |
320 | ; This directive allows you to disable certain functions.
321 | ; It receives a comma-delimited list of function names.
322 | ; https://php.net/disable-functions
323 | disable_functions =
324 |
325 | ; This directive allows you to disable certain classes.
326 | ; It receives a comma-delimited list of class names.
327 | ; https://php.net/disable-classes
328 | disable_classes =
329 |
330 | ; Colors for Syntax Highlighting mode. Anything that's acceptable in
331 | ; would work.
332 | ; https://php.net/syntax-highlighting
333 | ;highlight.string = #DD0000
334 | ;highlight.comment = #FF9900
335 | ;highlight.keyword = #007700
336 | ;highlight.default = #0000BB
337 | ;highlight.html = #000000
338 |
339 | ; If enabled, the request will be allowed to complete even if the user aborts
340 | ; the request. Consider enabling it if executing long requests, which may end up
341 | ; being interrupted by the user or a browser timing out. PHP's default behavior
342 | ; is to disable this feature.
343 | ; https://php.net/ignore-user-abort
344 | ;ignore_user_abort = On
345 |
346 | ; Determines the size of the realpath cache to be used by PHP. This value should
347 | ; be increased on systems where PHP opens many files to reflect the quantity of
348 | ; the file operations performed.
349 | ; Note: if open_basedir is set, the cache is disabled
350 | ; https://php.net/realpath-cache-size
351 | ;realpath_cache_size = 4096k
352 |
353 | ; Duration of time, in seconds for which to cache realpath information for a given
354 | ; file or directory. For systems with rarely changing files, consider increasing this
355 | ; value.
356 | ; https://php.net/realpath-cache-ttl
357 | ;realpath_cache_ttl = 120
358 |
359 | ; Enables or disables the circular reference collector.
360 | ; https://php.net/zend.enable-gc
361 | zend.enable_gc = On
362 |
363 | ; If enabled, scripts may be written in encodings that are incompatible with
364 | ; the scanner. CP936, Big5, CP949 and Shift_JIS are the examples of such
365 | ; encodings. To use this feature, mbstring extension must be enabled.
366 | ;zend.multibyte = Off
367 |
368 | ; Allows to set the default encoding for the scripts. This value will be used
369 | ; unless "declare(encoding=...)" directive appears at the top of the script.
370 | ; Only affects if zend.multibyte is set.
371 | ;zend.script_encoding =
372 |
373 | ; Allows to include or exclude arguments from stack traces generated for exceptions.
374 | ; In production, it is recommended to turn this setting on to prohibit the output
375 | ; of sensitive information in stack traces
376 | ; Default Value: Off
377 | ; Development Value: Off
378 | ; Production Value: On
379 | zend.exception_ignore_args = On
380 |
381 | ; Allows setting the maximum string length in an argument of a stringified stack trace
382 | ; to a value between 0 and 1000000.
383 | ; This has no effect when zend.exception_ignore_args is enabled.
384 | ; Default Value: 15
385 | ; Development Value: 15
386 | ; Production Value: 0
387 | ; In production, it is recommended to set this to 0 to reduce the output
388 | ; of sensitive information in stack traces.
389 | zend.exception_string_param_max_len = 0
390 |
391 | ;;;;;;;;;;;;;;;;;
392 | ; Miscellaneous ;
393 | ;;;;;;;;;;;;;;;;;
394 |
395 | ; Decides whether PHP may expose the fact that it is installed on the server
396 | ; (e.g. by adding its signature to the Web server header). It is no security
397 | ; threat in any way, but it makes it possible to determine whether you use PHP
398 | ; on your server or not.
399 | ; https://php.net/expose-php
400 | expose_php = On
401 |
402 | ;;;;;;;;;;;;;;;;;;;
403 | ; Resource Limits ;
404 | ;;;;;;;;;;;;;;;;;;;
405 |
406 | ; Maximum execution time of each script, in seconds
407 | ; https://php.net/max-execution-time
408 | ; Note: This directive is hardcoded to 0 for the CLI SAPI
409 | max_execution_time = 30
410 |
411 | ; Maximum amount of time each script may spend parsing request data. It's a good
412 | ; idea to limit this time on productions servers in order to eliminate unexpectedly
413 | ; long running scripts.
414 | ; Note: This directive is hardcoded to -1 for the CLI SAPI
415 | ; Default Value: -1 (Unlimited)
416 | ; Development Value: 60 (60 seconds)
417 | ; Production Value: 60 (60 seconds)
418 | ; https://php.net/max-input-time
419 | max_input_time = 60
420 |
421 | ; Maximum input variable nesting level
422 | ; https://php.net/max-input-nesting-level
423 | ;max_input_nesting_level = 64
424 |
425 | ; How many GET/POST/COOKIE input variables may be accepted
426 | ;max_input_vars = 1000
427 |
428 | ; Maximum amount of memory a script may consume
429 | ; https://php.net/memory-limit
430 | memory_limit = 128M
431 |
432 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
433 | ; Error handling and logging ;
434 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
435 |
436 | ; This directive informs PHP of which errors, warnings and notices you would like
437 | ; it to take action for. The recommended way of setting values for this
438 | ; directive is through the use of the error level constants and bitwise
439 | ; operators. The error level constants are below here for convenience as well as
440 | ; some common settings and their meanings.
441 | ; By default, PHP is set to take action on all errors, notices and warnings EXCEPT
442 | ; those related to E_NOTICE and E_STRICT, which together cover best practices and
443 | ; recommended coding standards in PHP. For performance reasons, this is the
444 | ; recommend error reporting setting. Your production server shouldn't be wasting
445 | ; resources complaining about best practices and coding standards. That's what
446 | ; development servers and development settings are for.
447 | ; Note: The php.ini-development file has this setting as E_ALL. This
448 | ; means it pretty much reports everything which is exactly what you want during
449 | ; development and early testing.
450 | ;
451 | ; Error Level Constants:
452 | ; E_ALL - All errors and warnings
453 | ; E_ERROR - fatal run-time errors
454 | ; E_RECOVERABLE_ERROR - almost fatal run-time errors
455 | ; E_WARNING - run-time warnings (non-fatal errors)
456 | ; E_PARSE - compile-time parse errors
457 | ; E_NOTICE - run-time notices (these are warnings which often result
458 | ; from a bug in your code, but it's possible that it was
459 | ; intentional (e.g., using an uninitialized variable and
460 | ; relying on the fact it is automatically initialized to an
461 | ; empty string)
462 | ; E_STRICT - run-time notices, enable to have PHP suggest changes
463 | ; to your code which will ensure the best interoperability
464 | ; and forward compatibility of your code
465 | ; E_CORE_ERROR - fatal errors that occur during PHP's initial startup
466 | ; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's
467 | ; initial startup
468 | ; E_COMPILE_ERROR - fatal compile-time errors
469 | ; E_COMPILE_WARNING - compile-time warnings (non-fatal errors)
470 | ; E_USER_ERROR - user-generated error message
471 | ; E_USER_WARNING - user-generated warning message
472 | ; E_USER_NOTICE - user-generated notice message
473 | ; E_DEPRECATED - warn about code that will not work in future versions
474 | ; of PHP
475 | ; E_USER_DEPRECATED - user-generated deprecation warnings
476 | ;
477 | ; Common Values:
478 | ; E_ALL (Show all errors, warnings and notices including coding standards.)
479 | ; E_ALL & ~E_NOTICE (Show all errors, except for notices)
480 | ; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.)
481 | ; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
482 | ; Default Value: E_ALL
483 | ; Development Value: E_ALL
484 | ; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
485 | ; https://php.net/error-reporting
486 | error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
487 |
488 | ; This directive controls whether or not and where PHP will output errors,
489 | ; notices and warnings too. Error output is very useful during development, but
490 | ; it could be very dangerous in production environments. Depending on the code
491 | ; which is triggering the error, sensitive information could potentially leak
492 | ; out of your application such as database usernames and passwords or worse.
493 | ; For production environments, we recommend logging errors rather than
494 | ; sending them to STDOUT.
495 | ; Possible Values:
496 | ; Off = Do not display any errors
497 | ; stderr = Display errors to STDERR (affects only CGI/CLI binaries!)
498 | ; On or stdout = Display errors to STDOUT
499 | ; Default Value: On
500 | ; Development Value: On
501 | ; Production Value: Off
502 | ; https://php.net/display-errors
503 | display_errors = Off
504 |
505 | ; The display of errors which occur during PHP's startup sequence are handled
506 | ; separately from display_errors. We strongly recommend you set this to 'off'
507 | ; for production servers to avoid leaking configuration details.
508 | ; Default Value: On
509 | ; Development Value: On
510 | ; Production Value: Off
511 | ; https://php.net/display-startup-errors
512 | display_startup_errors = Off
513 |
514 | ; Besides displaying errors, PHP can also log errors to locations such as a
515 | ; server-specific log, STDERR, or a location specified by the error_log
516 | ; directive found below. While errors should not be displayed on productions
517 | ; servers they should still be monitored and logging is a great way to do that.
518 | ; Default Value: Off
519 | ; Development Value: On
520 | ; Production Value: On
521 | ; https://php.net/log-errors
522 | log_errors = On
523 |
524 | ; Do not log repeated messages. Repeated errors must occur in same file on same
525 | ; line unless ignore_repeated_source is set true.
526 | ; https://php.net/ignore-repeated-errors
527 | ignore_repeated_errors = Off
528 |
529 | ; Ignore source of message when ignoring repeated messages. When this setting
530 | ; is On you will not log errors with repeated messages from different files or
531 | ; source lines.
532 | ; https://php.net/ignore-repeated-source
533 | ignore_repeated_source = Off
534 |
535 | ; If this parameter is set to Off, then memory leaks will not be shown (on
536 | ; stdout or in the log). This is only effective in a debug compile, and if
537 | ; error reporting includes E_WARNING in the allowed list
538 | ; https://php.net/report-memleaks
539 | report_memleaks = On
540 |
541 | ; This setting is off by default.
542 | ;report_zend_debug = 0
543 |
544 | ; Turn off normal error reporting and emit XML-RPC error XML
545 | ; https://php.net/xmlrpc-errors
546 | ;xmlrpc_errors = 0
547 |
548 | ; An XML-RPC faultCode
549 | ;xmlrpc_error_number = 0
550 |
551 | ; When PHP displays or logs an error, it has the capability of formatting the
552 | ; error message as HTML for easier reading. This directive controls whether
553 | ; the error message is formatted as HTML or not.
554 | ; Note: This directive is hardcoded to Off for the CLI SAPI
555 | ; https://php.net/html-errors
556 | ;html_errors = On
557 |
558 | ; If html_errors is set to On *and* docref_root is not empty, then PHP
559 | ; produces clickable error messages that direct to a page describing the error
560 | ; or function causing the error in detail.
561 | ; You can download a copy of the PHP manual from https://php.net/docs
562 | ; and change docref_root to the base URL of your local copy including the
563 | ; leading '/'. You must also specify the file extension being used including
564 | ; the dot. PHP's default behavior is to leave these settings empty, in which
565 | ; case no links to documentation are generated.
566 | ; Note: Never use this feature for production boxes.
567 | ; https://php.net/docref-root
568 | ; Examples
569 | ;docref_root = "/phpmanual/"
570 |
571 | ; https://php.net/docref-ext
572 | ;docref_ext = .html
573 |
574 | ; String to output before an error message. PHP's default behavior is to leave
575 | ; this setting blank.
576 | ; https://php.net/error-prepend-string
577 | ; Example:
578 | ;error_prepend_string = ""
579 |
580 | ; String to output after an error message. PHP's default behavior is to leave
581 | ; this setting blank.
582 | ; https://php.net/error-append-string
583 | ; Example:
584 | ;error_append_string = ""
585 |
586 | ; Log errors to specified file. PHP's default behavior is to leave this value
587 | ; empty.
588 | ; https://php.net/error-log
589 | ; Example:
590 | ;error_log = php_errors.log
591 | ; Log errors to syslog (Event Log on Windows).
592 | ;error_log = syslog
593 |
594 | ; The syslog ident is a string which is prepended to every message logged
595 | ; to syslog. Only used when error_log is set to syslog.
596 | ;syslog.ident = php
597 |
598 | ; The syslog facility is used to specify what type of program is logging
599 | ; the message. Only used when error_log is set to syslog.
600 | ;syslog.facility = user
601 |
602 | ; Set this to disable filtering control characters (the default).
603 | ; Some loggers only accept NVT-ASCII, others accept anything that's not
604 | ; control characters. If your logger accepts everything, then no filtering
605 | ; is needed at all.
606 | ; Allowed values are:
607 | ; ascii (all printable ASCII characters and NL)
608 | ; no-ctrl (all characters except control characters)
609 | ; all (all characters)
610 | ; raw (like "all", but messages are not split at newlines)
611 | ; https://php.net/syslog.filter
612 | ;syslog.filter = ascii
613 |
614 | ;windows.show_crt_warning
615 | ; Default value: 0
616 | ; Development value: 0
617 | ; Production value: 0
618 |
619 | ;;;;;;;;;;;;;;;;;
620 | ; Data Handling ;
621 | ;;;;;;;;;;;;;;;;;
622 |
623 | ; The separator used in PHP generated URLs to separate arguments.
624 | ; PHP's default setting is "&".
625 | ; https://php.net/arg-separator.output
626 | ; Example:
627 | ;arg_separator.output = "&"
628 |
629 | ; List of separator(s) used by PHP to parse input URLs into variables.
630 | ; PHP's default setting is "&".
631 | ; NOTE: Every character in this directive is considered as separator!
632 | ; https://php.net/arg-separator.input
633 | ; Example:
634 | ;arg_separator.input = ";&"
635 |
636 | ; This directive determines which super global arrays are registered when PHP
637 | ; starts up. G,P,C,E & S are abbreviations for the following respective super
638 | ; globals: GET, POST, COOKIE, ENV and SERVER. There is a performance penalty
639 | ; paid for the registration of these arrays and because ENV is not as commonly
640 | ; used as the others, ENV is not recommended on productions servers. You
641 | ; can still get access to the environment variables through getenv() should you
642 | ; need to.
643 | ; Default Value: "EGPCS"
644 | ; Development Value: "GPCS"
645 | ; Production Value: "GPCS";
646 | ; https://php.net/variables-order
647 | variables_order = "GPCS"
648 |
649 | ; This directive determines which super global data (G,P & C) should be
650 | ; registered into the super global array REQUEST. If so, it also determines
651 | ; the order in which that data is registered. The values for this directive
652 | ; are specified in the same manner as the variables_order directive,
653 | ; EXCEPT one. Leaving this value empty will cause PHP to use the value set
654 | ; in the variables_order directive. It does not mean it will leave the super
655 | ; globals array REQUEST empty.
656 | ; Default Value: None
657 | ; Development Value: "GP"
658 | ; Production Value: "GP"
659 | ; https://php.net/request-order
660 | request_order = "GP"
661 |
662 | ; This directive determines whether PHP registers $argv & $argc each time it
663 | ; runs. $argv contains an array of all the arguments passed to PHP when a script
664 | ; is invoked. $argc contains an integer representing the number of arguments
665 | ; that were passed when the script was invoked. These arrays are extremely
666 | ; useful when running scripts from the command line. When this directive is
667 | ; enabled, registering these variables consumes CPU cycles and memory each time
668 | ; a script is executed. For performance reasons, this feature should be disabled
669 | ; on production servers.
670 | ; Note: This directive is hardcoded to On for the CLI SAPI
671 | ; Default Value: On
672 | ; Development Value: Off
673 | ; Production Value: Off
674 | ; https://php.net/register-argc-argv
675 | register_argc_argv = Off
676 |
677 | ; When enabled, the ENV, REQUEST and SERVER variables are created when they're
678 | ; first used (Just In Time) instead of when the script starts. If these
679 | ; variables are not used within a script, having this directive on will result
680 | ; in a performance gain. The PHP directive register_argc_argv must be disabled
681 | ; for this directive to have any effect.
682 | ; https://php.net/auto-globals-jit
683 | auto_globals_jit = On
684 |
685 | ; Whether PHP will read the POST data.
686 | ; This option is enabled by default.
687 | ; Most likely, you won't want to disable this option globally. It causes $_POST
688 | ; and $_FILES to always be empty; the only way you will be able to read the
689 | ; POST data will be through the php://input stream wrapper. This can be useful
690 | ; to proxy requests or to process the POST data in a memory efficient fashion.
691 | ; https://php.net/enable-post-data-reading
692 | ;enable_post_data_reading = Off
693 |
694 | ; Maximum size of POST data that PHP will accept.
695 | ; Its value may be 0 to disable the limit. It is ignored if POST data reading
696 | ; is disabled through enable_post_data_reading.
697 | ; https://php.net/post-max-size
698 | post_max_size = 8M
699 |
700 | ; Automatically add files before PHP document.
701 | ; https://php.net/auto-prepend-file
702 | auto_prepend_file =
703 |
704 | ; Automatically add files after PHP document.
705 | ; https://php.net/auto-append-file
706 | auto_append_file =
707 |
708 | ; By default, PHP will output a media type using the Content-Type header. To
709 | ; disable this, simply set it to be empty.
710 | ;
711 | ; PHP's built-in default media type is set to text/html.
712 | ; https://php.net/default-mimetype
713 | default_mimetype = "text/html"
714 |
715 | ; PHP's default character set is set to UTF-8.
716 | ; https://php.net/default-charset
717 | default_charset = "UTF-8"
718 |
719 | ; PHP internal character encoding is set to empty.
720 | ; If empty, default_charset is used.
721 | ; https://php.net/internal-encoding
722 | ;internal_encoding =
723 |
724 | ; PHP input character encoding is set to empty.
725 | ; If empty, default_charset is used.
726 | ; https://php.net/input-encoding
727 | ;input_encoding =
728 |
729 | ; PHP output character encoding is set to empty.
730 | ; If empty, default_charset is used.
731 | ; See also output_buffer.
732 | ; https://php.net/output-encoding
733 | ;output_encoding =
734 |
735 | ;;;;;;;;;;;;;;;;;;;;;;;;;
736 | ; Paths and Directories ;
737 | ;;;;;;;;;;;;;;;;;;;;;;;;;
738 |
739 | ; UNIX: "/path1:/path2"
740 | ;include_path = ".:/php/includes"
741 | ;
742 | ; Windows: "\path1;\path2"
743 | ;include_path = ".;c:\php\includes"
744 | ;
745 | ; PHP's default setting for include_path is ".;/path/to/php/pear"
746 | ; https://php.net/include-path
747 |
748 | ; The root of the PHP pages, used only if nonempty.
749 | ; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root
750 | ; if you are running php as a CGI under any web server (other than IIS)
751 | ; see documentation for security issues. The alternate is to use the
752 | ; cgi.force_redirect configuration below
753 | ; https://php.net/doc-root
754 | doc_root =
755 |
756 | ; The directory under which PHP opens the script using /~username used only
757 | ; if nonempty.
758 | ; https://php.net/user-dir
759 | user_dir =
760 |
761 | ; Directory in which the loadable extensions (modules) reside.
762 | ; https://php.net/extension-dir
763 | ;extension_dir = "./"
764 | ; On windows:
765 | ;extension_dir = "ext"
766 |
767 | ; Directory where the temporary files should be placed.
768 | ; Defaults to the system default (see sys_get_temp_dir)
769 | ;sys_temp_dir = "/tmp"
770 |
771 | ; Whether or not to enable the dl() function. The dl() function does NOT work
772 | ; properly in multithreaded servers, such as IIS or Zeus, and is automatically
773 | ; disabled on them.
774 | ; https://php.net/enable-dl
775 | enable_dl = Off
776 |
777 | ; cgi.force_redirect is necessary to provide security running PHP as a CGI under
778 | ; most web servers. Left undefined, PHP turns this on by default. You can
779 | ; turn it off here AT YOUR OWN RISK
780 | ; **You CAN safely turn this off for IIS, in fact, you MUST.**
781 | ; https://php.net/cgi.force-redirect
782 | ;cgi.force_redirect = 1
783 |
784 | ; if cgi.nph is enabled it will force cgi to always sent Status: 200 with
785 | ; every request. PHP's default behavior is to disable this feature.
786 | ;cgi.nph = 1
787 |
788 | ; if cgi.force_redirect is turned on, and you are not running under Apache or Netscape
789 | ; (iPlanet) web servers, you MAY need to set an environment variable name that PHP
790 | ; will look for to know it is OK to continue execution. Setting this variable MAY
791 | ; cause security issues, KNOW WHAT YOU ARE DOING FIRST.
792 | ; https://php.net/cgi.redirect-status-env
793 | ;cgi.redirect_status_env =
794 |
795 | ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
796 | ; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
797 | ; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting
798 | ; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting
799 | ; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
800 | ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
801 | ; https://php.net/cgi.fix-pathinfo
802 | cgi.fix_pathinfo=0
803 |
804 | ; if cgi.discard_path is enabled, the PHP CGI binary can safely be placed outside
805 | ; of the web tree and people will not be able to circumvent .htaccess security.
806 | ;cgi.discard_path=1
807 |
808 | ; FastCGI under IIS supports the ability to impersonate
809 | ; security tokens of the calling client. This allows IIS to define the
810 | ; security context that the request runs under. mod_fastcgi under Apache
811 | ; does not currently support this feature (03/17/2002)
812 | ; Set to 1 if running under IIS. Default is zero.
813 | ; https://php.net/fastcgi.impersonate
814 | ;fastcgi.impersonate = 1
815 |
816 | ; Disable logging through FastCGI connection. PHP's default behavior is to enable
817 | ; this feature.
818 | ;fastcgi.logging = 0
819 |
820 | ; cgi.rfc2616_headers configuration option tells PHP what type of headers to
821 | ; use when sending HTTP response code. If set to 0, PHP sends Status: header that
822 | ; is supported by Apache. When this option is set to 1, PHP will send
823 | ; RFC2616 compliant header.
824 | ; Default is zero.
825 | ; https://php.net/cgi.rfc2616-headers
826 | ;cgi.rfc2616_headers = 0
827 |
828 | ; cgi.check_shebang_line controls whether CGI PHP checks for line starting with #!
829 | ; (shebang) at the top of the running script. This line might be needed if the
830 | ; script support running both as stand-alone script and via PHP CGI<. PHP in CGI
831 | ; mode skips this line and ignores its content if this directive is turned on.
832 | ; https://php.net/cgi.check-shebang-line
833 | ;cgi.check_shebang_line=1
834 |
835 | ;;;;;;;;;;;;;;;;
836 | ; File Uploads ;
837 | ;;;;;;;;;;;;;;;;
838 |
839 | ; Whether to allow HTTP file uploads.
840 | ; https://php.net/file-uploads
841 | file_uploads = On
842 |
843 | ; Temporary directory for HTTP uploaded files (will use system default if not
844 | ; specified).
845 | ; https://php.net/upload-tmp-dir
846 | ;upload_tmp_dir =
847 |
848 | ; Maximum allowed size for uploaded files.
849 | ; https://php.net/upload-max-filesize
850 | upload_max_filesize = 2M
851 |
852 | ; Maximum number of files that can be uploaded via a single request
853 | max_file_uploads = 20
854 |
855 | ;;;;;;;;;;;;;;;;;;
856 | ; Fopen wrappers ;
857 | ;;;;;;;;;;;;;;;;;;
858 |
859 | ; Whether to allow the treatment of URLs (like http:// or ftp://) as files.
860 | ; https://php.net/allow-url-fopen
861 | allow_url_fopen = On
862 |
863 | ; Whether to allow include/require to open URLs (like https:// or ftp://) as files.
864 | ; https://php.net/allow-url-include
865 | allow_url_include = Off
866 |
867 | ; Define the anonymous ftp password (your email address). PHP's default setting
868 | ; for this is empty.
869 | ; https://php.net/from
870 | ;from="john@doe.com"
871 |
872 | ; Define the User-Agent string. PHP's default setting for this is empty.
873 | ; https://php.net/user-agent
874 | ;user_agent="PHP"
875 |
876 | ; Default timeout for socket based streams (seconds)
877 | ; https://php.net/default-socket-timeout
878 | default_socket_timeout = 60
879 |
880 | ; If your scripts have to deal with files from Macintosh systems,
881 | ; or you are running on a Mac and need to deal with files from
882 | ; unix or win32 systems, setting this flag will cause PHP to
883 | ; automatically detect the EOL character in those files so that
884 | ; fgets() and file() will work regardless of the source of the file.
885 | ; https://php.net/auto-detect-line-endings
886 | ;auto_detect_line_endings = Off
887 |
888 | ;;;;;;;;;;;;;;;;;;;;;;
889 | ; Dynamic Extensions ;
890 | ;;;;;;;;;;;;;;;;;;;;;;
891 |
892 | ; If you wish to have an extension loaded automatically, use the following
893 | ; syntax:
894 | ;
895 | ; extension=modulename
896 | ;
897 | ; For example:
898 | ;
899 | ; extension=mysqli
900 | ;
901 | ; When the extension library to load is not located in the default extension
902 | ; directory, You may specify an absolute path to the library file:
903 | ;
904 | ; extension=/path/to/extension/mysqli.so
905 | ;
906 | ; Note : The syntax used in previous PHP versions ('extension=.so' and
907 | ; 'extension='php_.dll') is supported for legacy reasons and may be
908 | ; deprecated in a future PHP major version. So, when it is possible, please
909 | ; move to the new ('extension=) syntax.
910 | ;
911 | ; Notes for Windows environments :
912 | ;
913 | ; - Many DLL files are located in the ext/
914 | ; extension folders as well as the separate PECL DLL download.
915 | ; Be sure to appropriately set the extension_dir directive.
916 | ;
917 | ;extension=bz2
918 |
919 | ; The ldap extension must be before curl if OpenSSL 1.0.2 and OpenLDAP is used
920 | ; otherwise it results in segfault when unloading after using SASL.
921 | ; See https://github.com/php/php-src/issues/8620 for more info.
922 | ;extension=ldap
923 |
924 | ;extension=curl
925 | ;extension=ffi
926 | ;extension=ftp
927 | ;extension=fileinfo
928 | ;extension=gd
929 | ;extension=gettext
930 | ;extension=gmp
931 | ;extension=intl
932 | ;extension=imap
933 | ;extension=mbstring
934 | ;extension=exif ; Must be after mbstring as it depends on it
935 | ;extension=mysqli
936 | ;extension=oci8_12c ; Use with Oracle Database 12c Instant Client
937 | ;extension=oci8_19 ; Use with Oracle Database 19 Instant Client
938 | ;extension=odbc
939 | ;extension=openssl
940 | ;extension=pdo_firebird
941 | ;extension=pdo_mysql
942 | ;extension=pdo_oci
943 | ;extension=pdo_odbc
944 | ;extension=pdo_pgsql
945 | ;extension=pdo_sqlite
946 | ;extension=pgsql
947 | ;extension=shmop
948 |
949 | ; The MIBS data available in the PHP distribution must be installed.
950 | ; See https://www.php.net/manual/en/snmp.installation.php
951 | ;extension=snmp
952 |
953 | ;extension=soap
954 | ;extension=sockets
955 | ;extension=sodium
956 | ;extension=sqlite3
957 | ;extension=tidy
958 | ;extension=xsl
959 | ;extension=zip
960 |
961 | ;zend_extension=opcache
962 |
963 | ;;;;;;;;;;;;;;;;;;;
964 | ; Module Settings ;
965 | ;;;;;;;;;;;;;;;;;;;
966 |
967 | [CLI Server]
968 | ; Whether the CLI web server uses ANSI color coding in its terminal output.
969 | cli_server.color = On
970 |
971 | [Date]
972 | ; Defines the default timezone used by the date functions
973 | ; https://php.net/date.timezone
974 | ;date.timezone =
975 |
976 | ; https://php.net/date.default-latitude
977 | ;date.default_latitude = 31.7667
978 |
979 | ; https://php.net/date.default-longitude
980 | ;date.default_longitude = 35.2333
981 |
982 | ; https://php.net/date.sunrise-zenith
983 | ;date.sunrise_zenith = 90.833333
984 |
985 | ; https://php.net/date.sunset-zenith
986 | ;date.sunset_zenith = 90.833333
987 |
988 | [filter]
989 | ; https://php.net/filter.default
990 | ;filter.default = unsafe_raw
991 |
992 | ; https://php.net/filter.default-flags
993 | ;filter.default_flags =
994 |
995 | [iconv]
996 | ; Use of this INI entry is deprecated, use global input_encoding instead.
997 | ; If empty, default_charset or input_encoding or iconv.input_encoding is used.
998 | ; The precedence is: default_charset < input_encoding < iconv.input_encoding
999 | ;iconv.input_encoding =
1000 |
1001 | ; Use of this INI entry is deprecated, use global internal_encoding instead.
1002 | ; If empty, default_charset or internal_encoding or iconv.internal_encoding is used.
1003 | ; The precedence is: default_charset < internal_encoding < iconv.internal_encoding
1004 | ;iconv.internal_encoding =
1005 |
1006 | ; Use of this INI entry is deprecated, use global output_encoding instead.
1007 | ; If empty, default_charset or output_encoding or iconv.output_encoding is used.
1008 | ; The precedence is: default_charset < output_encoding < iconv.output_encoding
1009 | ; To use an output encoding conversion, iconv's output handler must be set
1010 | ; otherwise output encoding conversion cannot be performed.
1011 | ;iconv.output_encoding =
1012 |
1013 | [imap]
1014 | ; rsh/ssh logins are disabled by default. Use this INI entry if you want to
1015 | ; enable them. Note that the IMAP library does not filter mailbox names before
1016 | ; passing them to rsh/ssh command, thus passing untrusted data to this function
1017 | ; with rsh/ssh enabled is insecure.
1018 | ;imap.enable_insecure_rsh=0
1019 |
1020 | [intl]
1021 | ;intl.default_locale =
1022 | ; This directive allows you to produce PHP errors when some error
1023 | ; happens within intl functions. The value is the level of the error produced.
1024 | ; Default is 0, which does not produce any errors.
1025 | ;intl.error_level = E_WARNING
1026 | ;intl.use_exceptions = 0
1027 |
1028 | [sqlite3]
1029 | ; Directory pointing to SQLite3 extensions
1030 | ; https://php.net/sqlite3.extension-dir
1031 | ;sqlite3.extension_dir =
1032 |
1033 | ; SQLite defensive mode flag (only available from SQLite 3.26+)
1034 | ; When the defensive flag is enabled, language features that allow ordinary
1035 | ; SQL to deliberately corrupt the database file are disabled. This forbids
1036 | ; writing directly to the schema, shadow tables (eg. FTS data tables), or
1037 | ; the sqlite_dbpage virtual table.
1038 | ; https://www.sqlite.org/c3ref/c_dbconfig_defensive.html
1039 | ; (for older SQLite versions, this flag has no use)
1040 | ;sqlite3.defensive = 1
1041 |
1042 | [Pcre]
1043 | ; PCRE library backtracking limit.
1044 | ; https://php.net/pcre.backtrack-limit
1045 | ;pcre.backtrack_limit=100000
1046 |
1047 | ; PCRE library recursion limit.
1048 | ; Please note that if you set this value to a high number you may consume all
1049 | ; the available process stack and eventually crash PHP (due to reaching the
1050 | ; stack size limit imposed by the Operating System).
1051 | ; https://php.net/pcre.recursion-limit
1052 | ;pcre.recursion_limit=100000
1053 |
1054 | ; Enables or disables JIT compilation of patterns. This requires the PCRE
1055 | ; library to be compiled with JIT support.
1056 | ;pcre.jit=1
1057 |
1058 | [Pdo]
1059 | ; Whether to pool ODBC connections. Can be one of "strict", "relaxed" or "off"
1060 | ; https://php.net/pdo-odbc.connection-pooling
1061 | ;pdo_odbc.connection_pooling=strict
1062 |
1063 | [Pdo_mysql]
1064 | ; Default socket name for local MySQL connects. If empty, uses the built-in
1065 | ; MySQL defaults.
1066 | pdo_mysql.default_socket=
1067 |
1068 | [Phar]
1069 | ; https://php.net/phar.readonly
1070 | ;phar.readonly = On
1071 |
1072 | ; https://php.net/phar.require-hash
1073 | ;phar.require_hash = On
1074 |
1075 | ;phar.cache_list =
1076 |
1077 | [mail function]
1078 | ; For Win32 only.
1079 | ; https://php.net/smtp
1080 | SMTP = localhost
1081 | ; https://php.net/smtp-port
1082 | smtp_port = 25
1083 |
1084 | ; For Win32 only.
1085 | ; https://php.net/sendmail-from
1086 | ;sendmail_from = me@example.com
1087 |
1088 | ; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
1089 | ; https://php.net/sendmail-path
1090 | ;sendmail_path =
1091 |
1092 | ; Force the addition of the specified parameters to be passed as extra parameters
1093 | ; to the sendmail binary. These parameters will always replace the value of
1094 | ; the 5th parameter to mail().
1095 | ;mail.force_extra_parameters =
1096 |
1097 | ; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename
1098 | mail.add_x_header = Off
1099 |
1100 | ; The path to a log file that will log all mail() calls. Log entries include
1101 | ; the full path of the script, line number, To address and headers.
1102 | ;mail.log =
1103 | ; Log mail to syslog (Event Log on Windows).
1104 | ;mail.log = syslog
1105 |
1106 | [ODBC]
1107 | ; https://php.net/odbc.default-db
1108 | ;odbc.default_db = Not yet implemented
1109 |
1110 | ; https://php.net/odbc.default-user
1111 | ;odbc.default_user = Not yet implemented
1112 |
1113 | ; https://php.net/odbc.default-pw
1114 | ;odbc.default_pw = Not yet implemented
1115 |
1116 | ; Controls the ODBC cursor model.
1117 | ; Default: SQL_CURSOR_STATIC (default).
1118 | ;odbc.default_cursortype
1119 |
1120 | ; Allow or prevent persistent links.
1121 | ; https://php.net/odbc.allow-persistent
1122 | odbc.allow_persistent = On
1123 |
1124 | ; Check that a connection is still valid before reuse.
1125 | ; https://php.net/odbc.check-persistent
1126 | odbc.check_persistent = On
1127 |
1128 | ; Maximum number of persistent links. -1 means no limit.
1129 | ; https://php.net/odbc.max-persistent
1130 | odbc.max_persistent = -1
1131 |
1132 | ; Maximum number of links (persistent + non-persistent). -1 means no limit.
1133 | ; https://php.net/odbc.max-links
1134 | odbc.max_links = -1
1135 |
1136 | ; Handling of LONG fields. Returns number of bytes to variables. 0 means
1137 | ; passthru.
1138 | ; https://php.net/odbc.defaultlrl
1139 | odbc.defaultlrl = 4096
1140 |
1141 | ; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char.
1142 | ; See the documentation on odbc_binmode and odbc_longreadlen for an explanation
1143 | ; of odbc.defaultlrl and odbc.defaultbinmode
1144 | ; https://php.net/odbc.defaultbinmode
1145 | odbc.defaultbinmode = 1
1146 |
1147 | [MySQLi]
1148 |
1149 | ; Maximum number of persistent links. -1 means no limit.
1150 | ; https://php.net/mysqli.max-persistent
1151 | mysqli.max_persistent = -1
1152 |
1153 | ; Allow accessing, from PHP's perspective, local files with LOAD DATA statements
1154 | ; https://php.net/mysqli.allow_local_infile
1155 | ;mysqli.allow_local_infile = On
1156 |
1157 | ; It allows the user to specify a folder where files that can be sent via LOAD DATA
1158 | ; LOCAL can exist. It is ignored if mysqli.allow_local_infile is enabled.
1159 | ;mysqli.local_infile_directory =
1160 |
1161 | ; Allow or prevent persistent links.
1162 | ; https://php.net/mysqli.allow-persistent
1163 | mysqli.allow_persistent = On
1164 |
1165 | ; Maximum number of links. -1 means no limit.
1166 | ; https://php.net/mysqli.max-links
1167 | mysqli.max_links = -1
1168 |
1169 | ; Default port number for mysqli_connect(). If unset, mysqli_connect() will use
1170 | ; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the
1171 | ; compile-time value defined MYSQL_PORT (in that order). Win32 will only look
1172 | ; at MYSQL_PORT.
1173 | ; https://php.net/mysqli.default-port
1174 | mysqli.default_port = 3306
1175 |
1176 | ; Default socket name for local MySQL connects. If empty, uses the built-in
1177 | ; MySQL defaults.
1178 | ; https://php.net/mysqli.default-socket
1179 | mysqli.default_socket =
1180 |
1181 | ; Default host for mysqli_connect() (doesn't apply in safe mode).
1182 | ; https://php.net/mysqli.default-host
1183 | mysqli.default_host =
1184 |
1185 | ; Default user for mysqli_connect() (doesn't apply in safe mode).
1186 | ; https://php.net/mysqli.default-user
1187 | mysqli.default_user =
1188 |
1189 | ; Default password for mysqli_connect() (doesn't apply in safe mode).
1190 | ; Note that this is generally a *bad* idea to store passwords in this file.
1191 | ; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw")
1192 | ; and reveal this password! And of course, any users with read access to this
1193 | ; file will be able to reveal the password as well.
1194 | ; https://php.net/mysqli.default-pw
1195 | mysqli.default_pw =
1196 |
1197 | ; Allow or prevent reconnect
1198 | mysqli.reconnect = Off
1199 |
1200 | ; If this option is enabled, closing a persistent connection will rollback
1201 | ; any pending transactions of this connection, before it is put back
1202 | ; into the persistent connection pool.
1203 | ;mysqli.rollback_on_cached_plink = Off
1204 |
1205 | [mysqlnd]
1206 | ; Enable / Disable collection of general statistics by mysqlnd which can be
1207 | ; used to tune and monitor MySQL operations.
1208 | mysqlnd.collect_statistics = On
1209 |
1210 | ; Enable / Disable collection of memory usage statistics by mysqlnd which can be
1211 | ; used to tune and monitor MySQL operations.
1212 | mysqlnd.collect_memory_statistics = Off
1213 |
1214 | ; Records communication from all extensions using mysqlnd to the specified log
1215 | ; file.
1216 | ; https://php.net/mysqlnd.debug
1217 | ;mysqlnd.debug =
1218 |
1219 | ; Defines which queries will be logged.
1220 | ;mysqlnd.log_mask = 0
1221 |
1222 | ; Default size of the mysqlnd memory pool, which is used by result sets.
1223 | ;mysqlnd.mempool_default_size = 16000
1224 |
1225 | ; Size of a pre-allocated buffer used when sending commands to MySQL in bytes.
1226 | ;mysqlnd.net_cmd_buffer_size = 2048
1227 |
1228 | ; Size of a pre-allocated buffer used for reading data sent by the server in
1229 | ; bytes.
1230 | ;mysqlnd.net_read_buffer_size = 32768
1231 |
1232 | ; Timeout for network requests in seconds.
1233 | ;mysqlnd.net_read_timeout = 31536000
1234 |
1235 | ; SHA-256 Authentication Plugin related. File with the MySQL server public RSA
1236 | ; key.
1237 | ;mysqlnd.sha256_server_public_key =
1238 |
1239 | [OCI8]
1240 |
1241 | ; Connection: Enables privileged connections using external
1242 | ; credentials (OCI_SYSOPER, OCI_SYSDBA)
1243 | ; https://php.net/oci8.privileged-connect
1244 | ;oci8.privileged_connect = Off
1245 |
1246 | ; Connection: The maximum number of persistent OCI8 connections per
1247 | ; process. Using -1 means no limit.
1248 | ; https://php.net/oci8.max-persistent
1249 | ;oci8.max_persistent = -1
1250 |
1251 | ; Connection: The maximum number of seconds a process is allowed to
1252 | ; maintain an idle persistent connection. Using -1 means idle
1253 | ; persistent connections will be maintained forever.
1254 | ; https://php.net/oci8.persistent-timeout
1255 | ;oci8.persistent_timeout = -1
1256 |
1257 | ; Connection: The number of seconds that must pass before issuing a
1258 | ; ping during oci_pconnect() to check the connection validity. When
1259 | ; set to 0, each oci_pconnect() will cause a ping. Using -1 disables
1260 | ; pings completely.
1261 | ; https://php.net/oci8.ping-interval
1262 | ;oci8.ping_interval = 60
1263 |
1264 | ; Connection: Set this to a user chosen connection class to be used
1265 | ; for all pooled server requests with Oracle Database Resident
1266 | ; Connection Pooling (DRCP). To use DRCP, this value should be set to
1267 | ; the same string for all web servers running the same application,
1268 | ; the database pool must be configured, and the connection string must
1269 | ; specify to use a pooled server.
1270 | ;oci8.connection_class =
1271 |
1272 | ; High Availability: Using On lets PHP receive Fast Application
1273 | ; Notification (FAN) events generated when a database node fails. The
1274 | ; database must also be configured to post FAN events.
1275 | ;oci8.events = Off
1276 |
1277 | ; Tuning: This option enables statement caching, and specifies how
1278 | ; many statements to cache. Using 0 disables statement caching.
1279 | ; https://php.net/oci8.statement-cache-size
1280 | ;oci8.statement_cache_size = 20
1281 |
1282 | ; Tuning: Enables row prefetching and sets the default number of
1283 | ; rows that will be fetched automatically after statement execution.
1284 | ; https://php.net/oci8.default-prefetch
1285 | ;oci8.default_prefetch = 100
1286 |
1287 | ; Tuning: Sets the amount of LOB data that is internally returned from
1288 | ; Oracle Database when an Oracle LOB locator is initially retrieved as
1289 | ; part of a query. Setting this can improve performance by reducing
1290 | ; round-trips.
1291 | ; https://php.net/oci8.prefetch-lob-size
1292 | ; oci8.prefetch_lob_size = 0
1293 |
1294 | ; Compatibility. Using On means oci_close() will not close
1295 | ; oci_connect() and oci_new_connect() connections.
1296 | ; https://php.net/oci8.old-oci-close-semantics
1297 | ;oci8.old_oci_close_semantics = Off
1298 |
1299 | [PostgreSQL]
1300 | ; Allow or prevent persistent links.
1301 | ; https://php.net/pgsql.allow-persistent
1302 | pgsql.allow_persistent = On
1303 |
1304 | ; Detect broken persistent links always with pg_pconnect().
1305 | ; Auto reset feature requires a little overheads.
1306 | ; https://php.net/pgsql.auto-reset-persistent
1307 | pgsql.auto_reset_persistent = Off
1308 |
1309 | ; Maximum number of persistent links. -1 means no limit.
1310 | ; https://php.net/pgsql.max-persistent
1311 | pgsql.max_persistent = -1
1312 |
1313 | ; Maximum number of links (persistent+non persistent). -1 means no limit.
1314 | ; https://php.net/pgsql.max-links
1315 | pgsql.max_links = -1
1316 |
1317 | ; Ignore PostgreSQL backends Notice message or not.
1318 | ; Notice message logging require a little overheads.
1319 | ; https://php.net/pgsql.ignore-notice
1320 | pgsql.ignore_notice = 0
1321 |
1322 | ; Log PostgreSQL backends Notice message or not.
1323 | ; Unless pgsql.ignore_notice=0, module cannot log notice message.
1324 | ; https://php.net/pgsql.log-notice
1325 | pgsql.log_notice = 0
1326 |
1327 | [bcmath]
1328 | ; Number of decimal digits for all bcmath functions.
1329 | ; https://php.net/bcmath.scale
1330 | bcmath.scale = 0
1331 |
1332 | [browscap]
1333 | ; https://php.net/browscap
1334 | ;browscap = extra/browscap.ini
1335 |
1336 | [Session]
1337 | ; Handler used to store/retrieve data.
1338 | ; https://php.net/session.save-handler
1339 | session.save_handler = files
1340 |
1341 | ; Argument passed to save_handler. In the case of files, this is the path
1342 | ; where data files are stored. Note: Windows users have to change this
1343 | ; variable in order to use PHP's session functions.
1344 | ;
1345 | ; The path can be defined as:
1346 | ;
1347 | ; session.save_path = "N;/path"
1348 | ;
1349 | ; where N is an integer. Instead of storing all the session files in
1350 | ; /path, what this will do is use subdirectories N-levels deep, and
1351 | ; store the session data in those directories. This is useful if
1352 | ; your OS has problems with many files in one directory, and is
1353 | ; a more efficient layout for servers that handle many sessions.
1354 | ;
1355 | ; NOTE 1: PHP will not create this directory structure automatically.
1356 | ; You can use the script in the ext/session dir for that purpose.
1357 | ; NOTE 2: See the section on garbage collection below if you choose to
1358 | ; use subdirectories for session storage
1359 | ;
1360 | ; The file storage module creates files using mode 600 by default.
1361 | ; You can change that by using
1362 | ;
1363 | ; session.save_path = "N;MODE;/path"
1364 | ;
1365 | ; where MODE is the octal representation of the mode. Note that this
1366 | ; does not overwrite the process's umask.
1367 | ; https://php.net/session.save-path
1368 | ;session.save_path = "/tmp"
1369 |
1370 | ; Whether to use strict session mode.
1371 | ; Strict session mode does not accept an uninitialized session ID, and
1372 | ; regenerates the session ID if the browser sends an uninitialized session ID.
1373 | ; Strict mode protects applications from session fixation via a session adoption
1374 | ; vulnerability. It is disabled by default for maximum compatibility, but
1375 | ; enabling it is encouraged.
1376 | ; https://wiki.php.net/rfc/strict_sessions
1377 | session.use_strict_mode = 0
1378 |
1379 | ; Whether to use cookies.
1380 | ; https://php.net/session.use-cookies
1381 | session.use_cookies = 1
1382 |
1383 | ; https://php.net/session.cookie-secure
1384 | ;session.cookie_secure =
1385 |
1386 | ; This option forces PHP to fetch and use a cookie for storing and maintaining
1387 | ; the session id. We encourage this operation as it's very helpful in combating
1388 | ; session hijacking when not specifying and managing your own session id. It is
1389 | ; not the be-all and end-all of session hijacking defense, but it's a good start.
1390 | ; https://php.net/session.use-only-cookies
1391 | session.use_only_cookies = 1
1392 |
1393 | ; Name of the session (used as cookie name).
1394 | ; https://php.net/session.name
1395 | session.name = PHPSESSID
1396 |
1397 | ; Initialize session on request startup.
1398 | ; https://php.net/session.auto-start
1399 | session.auto_start = 0
1400 |
1401 | ; Lifetime in seconds of cookie or, if 0, until browser is restarted.
1402 | ; https://php.net/session.cookie-lifetime
1403 | session.cookie_lifetime = 0
1404 |
1405 | ; The path for which the cookie is valid.
1406 | ; https://php.net/session.cookie-path
1407 | session.cookie_path = /
1408 |
1409 | ; The domain for which the cookie is valid.
1410 | ; https://php.net/session.cookie-domain
1411 | session.cookie_domain =
1412 |
1413 | ; Whether or not to add the httpOnly flag to the cookie, which makes it
1414 | ; inaccessible to browser scripting languages such as JavaScript.
1415 | ; https://php.net/session.cookie-httponly
1416 | session.cookie_httponly =
1417 |
1418 | ; Add SameSite attribute to cookie to help mitigate Cross-Site Request Forgery (CSRF/XSRF)
1419 | ; Current valid values are "Strict", "Lax" or "None". When using "None",
1420 | ; make sure to include the quotes, as `none` is interpreted like `false` in ini files.
1421 | ; https://tools.ietf.org/html/draft-west-first-party-cookies-07
1422 | session.cookie_samesite =
1423 |
1424 | ; Handler used to serialize data. php is the standard serializer of PHP.
1425 | ; https://php.net/session.serialize-handler
1426 | session.serialize_handler = php
1427 |
1428 | ; Defines the probability that the 'garbage collection' process is started on every
1429 | ; session initialization. The probability is calculated by using gc_probability/gc_divisor,
1430 | ; e.g. 1/100 means there is a 1% chance that the GC process starts on each request.
1431 | ; Default Value: 1
1432 | ; Development Value: 1
1433 | ; Production Value: 1
1434 | ; https://php.net/session.gc-probability
1435 | session.gc_probability = 1
1436 |
1437 | ; Defines the probability that the 'garbage collection' process is started on every
1438 | ; session initialization. The probability is calculated by using gc_probability/gc_divisor,
1439 | ; e.g. 1/100 means there is a 1% chance that the GC process starts on each request.
1440 | ; For high volume production servers, using a value of 1000 is a more efficient approach.
1441 | ; Default Value: 100
1442 | ; Development Value: 1000
1443 | ; Production Value: 1000
1444 | ; https://php.net/session.gc-divisor
1445 | session.gc_divisor = 1000
1446 |
1447 | ; After this number of seconds, stored data will be seen as 'garbage' and
1448 | ; cleaned up by the garbage collection process.
1449 | ; https://php.net/session.gc-maxlifetime
1450 | session.gc_maxlifetime = 1440
1451 |
1452 | ; NOTE: If you are using the subdirectory option for storing session files
1453 | ; (see session.save_path above), then garbage collection does *not*
1454 | ; happen automatically. You will need to do your own garbage
1455 | ; collection through a shell script, cron entry, or some other method.
1456 | ; For example, the following script is the equivalent of setting
1457 | ; session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes):
1458 | ; find /path/to/sessions -cmin +24 -type f | xargs rm
1459 |
1460 | ; Check HTTP Referer to invalidate externally stored URLs containing ids.
1461 | ; HTTP_REFERER has to contain this substring for the session to be
1462 | ; considered as valid.
1463 | ; https://php.net/session.referer-check
1464 | session.referer_check =
1465 |
1466 | ; Set to {nocache,private,public,} to determine HTTP caching aspects
1467 | ; or leave this empty to avoid sending anti-caching headers.
1468 | ; https://php.net/session.cache-limiter
1469 | session.cache_limiter = nocache
1470 |
1471 | ; Document expires after n minutes.
1472 | ; https://php.net/session.cache-expire
1473 | session.cache_expire = 180
1474 |
1475 | ; trans sid support is disabled by default.
1476 | ; Use of trans sid may risk your users' security.
1477 | ; Use this option with caution.
1478 | ; - User may send URL contains active session ID
1479 | ; to other person via. email/irc/etc.
1480 | ; - URL that contains active session ID may be stored
1481 | ; in publicly accessible computer.
1482 | ; - User may access your site with the same session ID
1483 | ; always using URL stored in browser's history or bookmarks.
1484 | ; https://php.net/session.use-trans-sid
1485 | session.use_trans_sid = 0
1486 |
1487 | ; Set session ID character length. This value could be between 22 to 256.
1488 | ; Shorter length than default is supported only for compatibility reason.
1489 | ; Users should use 32 or more chars.
1490 | ; https://php.net/session.sid-length
1491 | ; Default Value: 32
1492 | ; Development Value: 26
1493 | ; Production Value: 26
1494 | session.sid_length = 26
1495 |
1496 | ; The URL rewriter will look for URLs in a defined set of HTML tags.
1497 | ;