Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [XML][MySQL][PHP] Uruchamianie skryptu aktualizującego dane do bazy
Forum PHP.pl > Forum > PHP
maniek2512
Witam mam kilka pytań odnośnie aktualizacji danych do bazy poprzez skrypt.

Otóż napisałem skrypt aktualizujący czasy danego użytkownika na danej trasie. Aby zoptymalizować działanie skryptu listę tras umieściłem w tablicy przez co nie muszę w cronie wpisywać adresów typu mojastrona.pl/update.php?trasa=2 itd (tras jest ponad 90 więc do dwóch serwerów było już trochę męczarni).

Więc mam sobie tablicę z której pobierane są id tras, następnie id trasy przypisywane jest do adresu z którego otrzymuję xml-a, którego nastepnie pobieram CURL-em i dodaję/aktualizuję w bazie. Oczywiście wszystko jest w pętli.

Skrypt wykonuje się dosyć długo więc nie wiem czy jest to dobra metoda i czy ewentualnie nie popełniłem jakichś błędów.

Lecz to zostawiam jak naraie na później, głównie chodzi mi o to co musiałbym zastosować aby:

1. Dodać odnośnik do aktualizacji (dla użytkowników) tak aby nie mogli podejrzeć adresu (skrypt miałby się wykonywać w tle) - obecnie korzystam z niewidocznego iframe lecz myślę, że nie jest to zbyt bezpieczna i dobra metoda. Myślałem o tym aby wykonać to w javie lecz nie wiem nawet czego mam szukać.
2. Chciałbym aby po kliknięciu przez użytkownika w odnośnik Aktualizuj pokazywała się informacja za jaki czas aktualizacja zostanie ukończona, coś takiego jak na tej stronie: http://nfsc-s.com/nfsw/MANIEK2512PL po kliknięciu w przycisk UPDATE.

Nie chodzi mi tu koniecznie o gotowe rozwiązania, a o np. linki do manuala lub napisanie czego mam szukać, co miałbym do tego wykorzystać.


Skrypt do aktualizacji dla singleplayer wygląda tak:
  1. <?
  2. //optional comment out or delete
  3. $tablica[] = array(299, 10, 302, 25, 71, 22, 26, 3, 57, 18, 360, 9, 72, 5, 317, 27, 41, 78, 34, 21, 24, 298, 43, 6, 39, 303, 307, 61, 56, 157, 82, 12, 83, 31, 17, 32, 33, 8, 308, 80, 120, 145, 52, 146, 79, 81, 314, 19, 292, 50, 76, 295, 7, 47, 55, 23, 309, 97, 28, 29, 38, 36, 37, 15, 49, 98, 77, 51, 289, 54, 16, 20, 35, 53, 13, 14, 30, 287, 131, 290, 11, 305, 45, 85, 147, 296, 509, 510, 517, 502, 516, 515, 501, 521);
  4.  
  5. foreach ( $tablica as $pozycja => $gracz )
  6. {
  7. for ( $i = 0; $i < count($gracz); $i++ )
  8. {
  9. echo '<td>' . $gracz[$i] . '</td>';
  10.  
  11. // The POST URL and parameters
  12.  
  13. $tryb = '2';
  14.  
  15.  
  16. $sql_host = '********';
  17. $sql_user = '*********';
  18. $sql_password = '**********';
  19. $sql_baza = '**********';
  20.  
  21.  
  22.  
  23. if (mysql_connect($sql_host, $sql_user, $sql_password) and mysql_select_db($sql_baza)) {
  24. $zapytanie = mysql_query("SELECT * FROM Server");
  25. if ($zapytanie) {
  26.  
  27. $rezultat = ''; // inicjalizujemy zmienna
  28. while ($wynik = mysql_fetch_array($zapytanie)) {
  29. if ($rezultat != '') {
  30. // rezultat NIE jest pusty, wiec dodajemy przecinek i spacje
  31. $rezultat .= ','; // to jest to samo co: $rezultat = $rezultat . ', ';
  32. }
  33.  
  34. $rezultat .= $wynik["nick"];
  35.  
  36. }
  37.  
  38. } else {
  39. echo "Nie można wykonać zapytania!";
  40. }
  41. }
  42.  
  43.  
  44. $request = 'http://world.needforspeed.com/SpeedAPI/ws/game/1/nfsw/leaderboards?et='.$tryb.'&eid='.$gracz[$i].'&lt=1&dn='.$rezultat.'&shard=CHICANE';
  45.  
  46. // POST the curl session object
  47. $session = curl_init($request);
  48.  
  49. // Set the POST options.
  50. curl_setopt ($session, CURLOPT_POST, true);
  51. curl_setopt ($session, CURLOPT_POSTFIELDS, $request);
  52. curl_setopt($session, CURLOPT_HEADER, true);
  53. curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
  54.  
  55. // Do the POST and then close the session
  56. $response = curl_exec($session);
  57. curl_close($session);
  58.  
  59. // POST HTTP Status code from the response
  60. $status_code = array();
  61. preg_match('/\d\d\d/', $response, $status_code);
  62.  
  63. // Check for errors
  64. switch( $status_code[0] ) {
  65. case 200:
  66. // Success
  67. break;
  68. case 503:
  69. die('Service unavailable. An internal problem prevented us from returning data to you.');
  70. break;
  71. case 403:
  72. die('Forbidden. You do not have permission to access this resource, or are over your rate limit.');
  73. break;
  74. case 409:
  75. die('<font color="white"> Nie można pobrać danych z serwerów EA. Prawdopodobnie serwery są wyłączone.</font> ');
  76. break;
  77. case 400:
  78. // You may want to fall through here and read the specific XML error
  79. die('Bad request. The parameters passed to the service did not match as expected. The exact error is returned in the XML response.');
  80. break;
  81. default:
  82. die('Your call returned an unexpected HTTP status of:' . $status_code[0]);
  83. }
  84.  
  85. // POST the XML from the response, bypassing the header
  86. if (!($xml = strstr($response, '<?xml'))) {
  87. $xml = null;
  88. }
  89.  
  90. // Output the XML
  91.  
  92. $worldLeaderboard = simplexml_load_string($xml);
  93.  
  94.  
  95.  
  96. foreach($worldLeaderboard as $linia)
  97.  
  98. {
  99.  
  100. $search = array('CAR_MDL_','CAR1002', 'CAR1004', 'CAR1006', 'CAR1008', 'CAR1010', 'CAR1012', 'CAR1014', 'CAR1016', 'CAR1018', 'CAR1020', 'CAR1022', 'CAR1024', 'CAR1026', 'CAR1028', 'CAR1030', 'CAR1032', 'CAR1034', 'CAR1036', 'CAR1038', 'CAR1040', 'CAR1044', 'CAR1046', 'CAR1048', 'CAR1050', 'CAR1054');
  101. $replace = array('','911 GT3 RS 4.0', 'ZONDA CINQUE', 'Reventon', 'F1 ELITE', 'SKYLINE GT-R NISMO', 'ECLIPSE GS-T', 'R8 LMS ULTRA', 'B2', 'MP4-12C HALLOWEEN', 'F-150 RAPTOR', 'ESCORT MK1 RS1600', 'RABBIT SUV', 'RX-7 FC3S', 'H1 SNOWFLAKE 3.0', 'CCXR EDITION', 'COBALT SS', 'AVENTADOR', 'MONARO', 'AGERA', '914', 'POLICE INTERCEPTOR', 'CAPRi', 'COBRA 427', 'A3 3.2', 'H1');
  102. $subject = ''.$linia['carName'].'';
  103. $carName = str_replace($search, $replace, $subject);
  104. echo $carName;
  105.  
  106. $search1 = array('CAR_MANU_');
  107. $replace1 = array('');
  108. $subject1 = ''.$linia['make'].'';
  109. $carMake = str_replace($search1, $replace1, $subject1);
  110.  
  111. echo $carMake;
  112.  
  113.  
  114. $sql_conn = mysql_connect($sql_host, $sql_user, $sql_password)
  115. mysql_select_db($sql_baza);
  116. $zapytanie = "INSERT INTO `single$gracz[$i]` (`nick`, `marka`, `model`, `czas`) VALUES ('{$linia['personaName']}', '$carMake', '$carName', '{$linia['eventDuration']}')";
  117. $idzapytania = mysql_query($zapytanie);
  118.  
  119. $zapytanie2 = "UPDATE `single$gracz[$i]` SET `marka` = '$carMake', `model` = '$carName', `czas` = '{$linia['eventDuration']}' WHERE `nick`='{$linia['personaName']}'";
  120. $idzapytania2 = mysql_query($zapytanie2);
  121. mysql_close($sql_conn);
  122.  
  123.  
  124. echo $zapytanie2;
  125. }
  126.  
  127. }
  128.  
  129.  
  130.  
  131.  
  132. }
  133. ?>


Jeśli była by taka mozliwość prosiłbym o sprawdzenie poprawności kodu, zdaję sobię sprawę, że może w nim być sporo błędów. Można by go było zoptymalizować i zabezpieczyć lecz jak narazie nie wiem jak.
Skrypt działa poprawnie czyli dodaje/aktualizuje dane lecz jeśli mona go jakoś zabezpieczyć/ zoptymalizować prosiłbym o jakie kolwiek podpowiedzi smile.gif

z góry dziękuję

jeśli czegoś nie zroumiesz- pisz postaram się to lepiej wytłumaczyć
!*!
- zapytania do bazy w pętli to nie jest dobry pomysł.
- zastosuj też cache, aby skrypt nie był wykonywany za każdym razem, tylko np. co 2 minuty.
- jak masz możliwość, przejdź na PDO, ponieważ za jakiś czas mysql_* przestanie działać.

Odpowiadając na pytania

1. Zrób odwołanie do pliku "jx.php" który wykona te zadanie np. poprzez ajax, choć nie koniecznie. Jeśli idzie o wklepanie ścieżki bezpośredniej do pliku, to można to obejść wpisując w index.php
  1. define('XXX', 'QWERTY');


a w pliku tym który wykonuje te operacje:
  1. defined('XXX') or exit();



Dzięki czemu, każdy kto wpisze adres pliku zobaczy białą stronę (skrypt zostaje przerwany).

2. Tu nie mam pomysłu... najprościej będzie zapisać informacje o tym ile skrypt wykonuje się (time) i wyświetlić to jako dekoracje w JS.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.