PageRenderTime 43ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/web/tracking.php

https://gitlab.com/x33n/platform-application
PHP | 163 lines | 108 code | 22 blank | 33 comment | 17 complexity | b8ddddba360d8039430111823b62c0f4 MD5 | raw file
  1. <?php
  2. /**
  3. * This is tracking endpoint, which must be as fast as possible.
  4. * KISS.
  5. */
  6. $trackingFolder = '../app/logs/tracking';
  7. $settingsFile = $trackingFolder . DIRECTORY_SEPARATOR . 'settings.ser';
  8. $settings = [
  9. 'dynamic_tracking_enabled' => true,
  10. 'dynamic_tracking_endpoint' => '/tracking/data/create',
  11. 'log_rotate_interval' => 60,
  12. 'piwik_host' => null,
  13. 'piwik_token_auth' => null
  14. ];
  15. /**
  16. * Pass request to given URL.
  17. *
  18. * @param string $url
  19. */
  20. function passDataToUrl($url)
  21. {
  22. // Send visit to new URL
  23. $handle = curl_init();
  24. curl_setopt($handle, CURLOPT_URL, modifyUrl($url));
  25. curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1);
  26. curl_exec($handle);
  27. curl_close($handle);
  28. }
  29. /**
  30. * @param string $url
  31. *
  32. * @return string
  33. */
  34. function modifyUrl($url)
  35. {
  36. if (strpos($url, 'http') !== 0) {
  37. $schema = 'http';
  38. if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') {
  39. $schema .= 's';
  40. }
  41. $url = $schema . '://' . $_SERVER['HTTP_HOST'] . $url;
  42. }
  43. // Pass request data to new URL
  44. $delimiter = strpos($url, '?') === false ? '?' : '&';
  45. $url .= $delimiter . $_SERVER['QUERY_STRING'];
  46. // Set visit date time
  47. $url .= '&loggedAt=' . urlencode(getLoggedAt());
  48. // Set visit IP address
  49. $url .= '&cip=' . urlencode(getClientIp());
  50. if (!empty($_SERVER['HTTP_USER_AGENT'])) {
  51. $url .= '&ua=' . urlencode($_SERVER['HTTP_USER_AGENT']);
  52. }
  53. if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
  54. $url .= '&lang=' . urlencode($_SERVER['HTTP_ACCEPT_LANGUAGE']);
  55. }
  56. return $url;
  57. }
  58. function getClientIp()
  59. {
  60. // Set correct visitor information
  61. if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
  62. $ip = $_SERVER['HTTP_CLIENT_IP'];
  63. } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  64. $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  65. } else {
  66. $ip = $_SERVER['REMOTE_ADDR'];
  67. }
  68. return $ip;
  69. }
  70. function passDataToApplication($url)
  71. {
  72. $_SERVER['REQUEST_URI'] = modifyUrl($url);
  73. $_GET['loggedAt'] = getLoggedAt();
  74. $_GET['cip'] = getClientIp();
  75. $_GET['ua'] = $_SERVER['HTTP_USER_AGENT'];
  76. require_once __DIR__ . '/../app/bootstrap.php.cache';
  77. require_once __DIR__ . '/../app/AppKernel.php';
  78. $kernel = new AppKernel('prod', false);
  79. $kernel->loadClassCache();
  80. $request = \Symfony\Component\HttpFoundation\Request::createFromGlobals();
  81. $kernel->handle($request);
  82. }
  83. /**
  84. * Get log datetime
  85. *
  86. * @return string
  87. */
  88. function getLoggedAt()
  89. {
  90. $now = new \DateTime('now', new \DateTimeZone('UTC'));
  91. return $now->format(\DateTime::ISO8601);
  92. }
  93. // Ensure tracking directory exists and read settings
  94. if (is_dir($trackingFolder)) {
  95. if (is_readable($settingsFile)) {
  96. $settings = unserialize(file_get_contents($settingsFile));
  97. }
  98. } else {
  99. mkdir($trackingFolder);
  100. }
  101. // Track visit
  102. if ($settings['dynamic_tracking_enabled']) {
  103. // Pass visit to dynamic tracking endpoint
  104. passDataToApplication($settings['dynamic_tracking_endpoint']);
  105. } else {
  106. // Calculate interval part
  107. $rotateInterval = 60;
  108. $currentPart = 1;
  109. if ($settings['log_rotate_interval'] > 0 && $settings['log_rotate_interval'] < 60) {
  110. $rotateInterval = (int)$settings['log_rotate_interval'];
  111. $passingMinute = (int)(date('i')) + 1;
  112. $currentPart = ceil($passingMinute / $rotateInterval);
  113. }
  114. // Construct file name
  115. $date = new \DateTime('now', new \DateTimeZone('UTC'));
  116. $fileName = $date->format('Ymd-H') . '-' . $rotateInterval . '-' . $currentPart . '.log';
  117. // Add visit to log to file
  118. $rawData = $_GET;
  119. $rawData['loggedAt'] = getLoggedAt();
  120. $data = json_encode($rawData) . PHP_EOL;
  121. $fh = fopen($trackingFolder . DIRECTORY_SEPARATOR . $fileName, 'a');
  122. if (flock($fh, LOCK_EX)) {
  123. fwrite($fh, $data);
  124. fflush($fh);
  125. flock($fh, LOCK_UN);
  126. }
  127. fclose($fh);
  128. }
  129. // Pass tracking request to piwik instance
  130. if ($settings['piwik_host']) {
  131. $piwikTrackingUrl = $settings['piwik_host'] . '/piwik.php';
  132. if ($settings['piwik_token_auth']) {
  133. $piwikTrackingUrl .= '?token_auth=' . urlencode($settings['piwik_token_auth']);
  134. }
  135. passDataToUrl($piwikTrackingUrl);
  136. }
  137. //Disable XSS Auditor
  138. header('X-XSS-Protection: 0');
  139. //Send 1x1 blank gif
  140. header('Content-Type: image/gif');
  141. echo base64_decode('R0lGODlhAQABAJAAAP8AAAAAACH5BAUQAAAALAAAAAABAAEAAAICBAEAOw==');