TCRB und Datenbank umgebaut für Imort Runs

This commit is contained in:
2026-04-05 09:43:19 +02:00
parent cbeced3a2a
commit 39685ac989
9 changed files with 2012 additions and 8 deletions
+282
View File
@@ -205,3 +205,285 @@ Stack trace:
[Sat Apr 4 19:33:39 2026] 127.0.0.1:51368 Accepted
[Sat Apr 4 19:33:40 2026] 127.0.0.1:51368 [200]: GET /favicon.ico
[Sat Apr 4 19:33:40 2026] 127.0.0.1:51368 Closing
[Sat Apr 4 19:40:22 2026] 127.0.0.1:51175 Accepted
[Sat Apr 4 19:40:22 2026] 127.0.0.1:51175 [302]: GET /settings.php
[Sat Apr 4 19:40:22 2026] 127.0.0.1:51175 Closing
[Sat Apr 4 19:40:22 2026] 127.0.0.1:51176 Accepted
[Sat Apr 4 19:40:22 2026] 127.0.0.1:51176 [200]: GET /login.php
[Sat Apr 4 19:40:22 2026] 127.0.0.1:51176 Closing
[Sat Apr 4 19:40:54 2026] 127.0.0.1:57107 Accepted
[Sat Apr 4 19:40:54 2026] 127.0.0.1:57107 [302]: GET /settings.php
[Sat Apr 4 19:40:54 2026] 127.0.0.1:57107 Closing
[Sat Apr 4 19:40:54 2026] 127.0.0.1:57108 Accepted
[Sat Apr 4 19:40:54 2026] 127.0.0.1:57108 [200]: GET /login.php
[Sat Apr 4 19:40:54 2026] 127.0.0.1:57108 Closing
[Sat Apr 4 19:43:07 2026] 127.0.0.1:60471 Accepted
[Sat Apr 4 19:43:07 2026] 127.0.0.1:60471 [200]: GET /my_favorites.php
[Sat Apr 4 19:43:07 2026] 127.0.0.1:60471 Closing
[Sat Apr 4 19:43:07 2026] 127.0.0.1:63523 Accepted
[Sat Apr 4 19:43:07 2026] 127.0.0.1:63523 [200]: GET /css/style.css
[Sat Apr 4 19:43:07 2026] 127.0.0.1:63523 Closing
[Sat Apr 4 19:43:07 2026] 127.0.0.1:53915 Accepted
[Sat Apr 4 19:43:07 2026] 127.0.0.1:65359 Accepted
[Sat Apr 4 19:43:07 2026] 127.0.0.1:53915 [200]: GET /images/star16x16.png
[Sat Apr 4 19:43:07 2026] 127.0.0.1:65359 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 19:43:07 2026] 127.0.0.1:53915 Closing
[Sat Apr 4 19:43:07 2026] 127.0.0.1:65359 Closing
[Sat Apr 4 19:43:08 2026] 127.0.0.1:57355 Accepted
[Sat Apr 4 19:43:08 2026] 127.0.0.1:57355 [200]: GET /favicon.ico
[Sat Apr 4 19:43:08 2026] 127.0.0.1:57355 Closing
[Sat Apr 4 19:43:10 2026] 127.0.0.1:51011 Accepted
[Sat Apr 4 19:43:10 2026] 127.0.0.1:51011 [200]: GET /settings.php
[Sat Apr 4 19:43:10 2026] 127.0.0.1:51011 Closing
[Sat Apr 4 19:43:10 2026] 127.0.0.1:60289 Accepted
[Sat Apr 4 19:43:10 2026] 127.0.0.1:60289 [200]: GET /css/style.css
[Sat Apr 4 19:43:10 2026] 127.0.0.1:60289 Closing
[Sat Apr 4 19:43:10 2026] 127.0.0.1:63366 Accepted
[Sat Apr 4 19:43:10 2026] 127.0.0.1:63366 [200]: GET /images/star16x16.png
[Sat Apr 4 19:43:10 2026] 127.0.0.1:58674 Accepted
[Sat Apr 4 19:43:10 2026] 127.0.0.1:58674 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 19:43:10 2026] 127.0.0.1:63366 Closing
[Sat Apr 4 19:43:10 2026] 127.0.0.1:58674 Closing
[Sat Apr 4 19:43:10 2026] 127.0.0.1:54239 Accepted
[Sat Apr 4 19:43:11 2026] 127.0.0.1:54239 [200]: GET /favicon.ico
[Sat Apr 4 19:43:11 2026] 127.0.0.1:54239 Closing
[Sat Apr 4 19:48:27 2026] 127.0.0.1:59536 Accepted
[Sat Apr 4 19:48:27 2026] 127.0.0.1:59536 [200]: GET /settings.php
[Sat Apr 4 19:48:27 2026] 127.0.0.1:59536 Closing
[Sat Apr 4 19:48:27 2026] 127.0.0.1:59856 Accepted
[Sat Apr 4 19:48:27 2026] 127.0.0.1:59856 [200]: GET /css/style.css
[Sat Apr 4 19:48:27 2026] 127.0.0.1:59856 Closing
[Sat Apr 4 19:48:27 2026] 127.0.0.1:60559 Accepted
[Sat Apr 4 19:48:27 2026] 127.0.0.1:50765 Accepted
[Sat Apr 4 19:48:27 2026] 127.0.0.1:60559 [200]: GET /images/star16x16.png
[Sat Apr 4 19:48:27 2026] 127.0.0.1:50765 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 19:48:27 2026] 127.0.0.1:60559 Closing
[Sat Apr 4 19:48:27 2026] 127.0.0.1:50765 Closing
[Sat Apr 4 19:48:27 2026] 127.0.0.1:64157 Accepted
[Sat Apr 4 19:48:28 2026] 127.0.0.1:64157 [200]: GET /favicon.ico
[Sat Apr 4 19:48:28 2026] 127.0.0.1:64157 Closing
[Sat Apr 4 19:48:36 2026] 127.0.0.1:53240 Accepted
[Sat Apr 4 19:48:36 2026] 127.0.0.1:53240 [200]: POST /settings.php
[Sat Apr 4 19:48:36 2026] 127.0.0.1:53240 Closing
[Sat Apr 4 19:48:36 2026] 127.0.0.1:52502 Accepted
[Sat Apr 4 19:48:36 2026] 127.0.0.1:52502 [200]: GET /css/style.css
[Sat Apr 4 19:48:36 2026] 127.0.0.1:52502 Closing
[Sat Apr 4 19:48:36 2026] 127.0.0.1:57085 Accepted
[Sat Apr 4 19:48:36 2026] 127.0.0.1:58526 Accepted
[Sat Apr 4 19:48:36 2026] 127.0.0.1:57085 [200]: GET /images/star16x16.png
[Sat Apr 4 19:48:36 2026] 127.0.0.1:58526 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 19:48:36 2026] 127.0.0.1:57085 Closing
[Sat Apr 4 19:48:36 2026] 127.0.0.1:58526 Closing
[Sat Apr 4 19:48:36 2026] 127.0.0.1:62820 Accepted
[Sat Apr 4 19:48:37 2026] 127.0.0.1:62820 [200]: GET /favicon.ico
[Sat Apr 4 19:48:37 2026] 127.0.0.1:62820 Closing
[Sat Apr 4 19:48:45 2026] 127.0.0.1:65378 Accepted
[Sat Apr 4 19:48:45 2026] 127.0.0.1:65378 [200]: GET /telegram/connect.php
[Sat Apr 4 19:48:45 2026] 127.0.0.1:65378 Closing
[Sat Apr 4 19:48:45 2026] 127.0.0.1:63398 Accepted
[Sat Apr 4 19:48:45 2026] 127.0.0.1:63398 [200]: GET /css/style.css
[Sat Apr 4 19:48:45 2026] 127.0.0.1:63398 Closing
[Sat Apr 4 19:48:45 2026] 127.0.0.1:59277 Accepted
[Sat Apr 4 19:48:45 2026] 127.0.0.1:53328 Accepted
[Sat Apr 4 19:48:45 2026] 127.0.0.1:59277 [200]: GET /images/star16x16.png
[Sat Apr 4 19:48:45 2026] 127.0.0.1:53328 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 19:48:45 2026] 127.0.0.1:59277 Closing
[Sat Apr 4 19:48:45 2026] 127.0.0.1:53328 Closing
[Sat Apr 4 19:48:45 2026] 127.0.0.1:64543 Accepted
[Sat Apr 4 19:48:46 2026] 127.0.0.1:64543 [200]: GET /favicon.ico
[Sat Apr 4 19:48:46 2026] 127.0.0.1:64543 Closing
[Sat Apr 4 19:51:52 2026] 127.0.0.1:49354 Accepted
[Sat Apr 4 19:51:52 2026] 127.0.0.1:49354 [302]: GET /telegram/connect.php
[Sat Apr 4 19:51:52 2026] 127.0.0.1:49354 Closing
[Sat Apr 4 19:51:52 2026] 127.0.0.1:49355 Accepted
[Sat Apr 4 19:51:52 2026] 127.0.0.1:49355 [200]: GET /login.php
[Sat Apr 4 19:51:52 2026] 127.0.0.1:49355 Closing
[Sat Apr 4 19:56:56 2026] 127.0.0.1:49500 Accepted
[Sat Apr 4 19:56:56 2026] 127.0.0.1:49500 [302]: GET /telegram/connect.php
[Sat Apr 4 19:56:56 2026] 127.0.0.1:49500 Closing
[Sat Apr 4 19:56:56 2026] 127.0.0.1:49501 Accepted
[Sat Apr 4 19:56:57 2026] 127.0.0.1:49501 [200]: GET /login.php
[Sat Apr 4 19:56:57 2026] 127.0.0.1:49501 Closing
[Sat Apr 4 20:10:11 2026] 127.0.0.1:51757 Accepted
[Sat Apr 4 20:10:11 2026] 127.0.0.1:51757 [302]: GET /telegram/broadcast_test.php
[Sat Apr 4 20:10:11 2026] 127.0.0.1:51757 Closing
[Sat Apr 4 20:10:45 2026] 127.0.0.1:61088 Accepted
[Sat Apr 4 20:10:45 2026] 127.0.0.1:61088 [200]: GET /admin_users.php
[Sat Apr 4 20:10:45 2026] 127.0.0.1:61088 Closing
[Sat Apr 4 20:10:45 2026] 127.0.0.1:58250 Accepted
[Sat Apr 4 20:10:45 2026] 127.0.0.1:58250 [200]: GET /css/style.css
[Sat Apr 4 20:10:45 2026] 127.0.0.1:58250 Closing
[Sat Apr 4 20:10:45 2026] 127.0.0.1:62701 Accepted
[Sat Apr 4 20:10:45 2026] 127.0.0.1:62701 [200]: GET /images/star16x16.png
[Sat Apr 4 20:10:45 2026] 127.0.0.1:50531 Accepted
[Sat Apr 4 20:10:45 2026] 127.0.0.1:50531 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 20:10:45 2026] 127.0.0.1:62701 Closing
[Sat Apr 4 20:10:45 2026] 127.0.0.1:50531 Closing
[Sat Apr 4 20:10:45 2026] 127.0.0.1:60043 Accepted
[Sat Apr 4 20:10:46 2026] 127.0.0.1:60043 [200]: GET /favicon.ico
[Sat Apr 4 20:10:46 2026] 127.0.0.1:60043 Closing
[Sat Apr 4 20:10:48 2026] 127.0.0.1:49369 Accepted
[Sat Apr 4 20:10:49 2026] 127.0.0.1:49369 [200]: GET /telegram/broadcast_test.php
[Sat Apr 4 20:10:49 2026] 127.0.0.1:49369 Closing
[Sat Apr 4 20:10:49 2026] 127.0.0.1:53364 Accepted
[Sat Apr 4 20:10:49 2026] 127.0.0.1:53364 [200]: GET /css/style.css
[Sat Apr 4 20:10:49 2026] 127.0.0.1:53364 Closing
[Sat Apr 4 20:10:49 2026] 127.0.0.1:57509 Accepted
[Sat Apr 4 20:10:49 2026] 127.0.0.1:57509 [200]: GET /images/star16x16.png
[Sat Apr 4 20:10:49 2026] 127.0.0.1:57509 Closing
[Sat Apr 4 20:10:49 2026] 127.0.0.1:60548 Accepted
[Sat Apr 4 20:10:49 2026] 127.0.0.1:60548 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 20:10:49 2026] 127.0.0.1:60548 Closing
[Sat Apr 4 20:10:49 2026] 127.0.0.1:57884 Accepted
[Sat Apr 4 20:10:49 2026] 127.0.0.1:57884 [200]: GET /favicon.ico
[Sat Apr 4 20:10:49 2026] 127.0.0.1:57884 Closing
[Sat Apr 4 20:10:56 2026] 127.0.0.1:60086 Accepted
[Sat Apr 4 20:10:56 2026] PHP Fatal error: Uncaught Error: Call to undefined function mb_strlen() in C:\Users\ich\source\repos\skyview.astronomiemuseum.de\public\telegram\broadcast_test.php:225
Stack trace:
#0 {main}
thrown in C:\Users\ich\source\repos\skyview.astronomiemuseum.de\public\telegram\broadcast_test.php on line 225
[Sat Apr 4 20:10:56 2026] 127.0.0.1:60086 [200]: POST /telegram/broadcast_test.php - Uncaught Error: Call to undefined function mb_strlen() in C:\Users\ich\source\repos\skyview.astronomiemuseum.de\public\telegram\broadcast_test.php:225
Stack trace:
#0 {main}
thrown in C:\Users\ich\source\repos\skyview.astronomiemuseum.de\public\telegram\broadcast_test.php on line 225
[Sat Apr 4 20:10:56 2026] 127.0.0.1:60086 Closing
[Sat Apr 4 20:10:56 2026] 127.0.0.1:60739 Accepted
[Sat Apr 4 20:10:57 2026] 127.0.0.1:60739 [200]: GET /favicon.ico
[Sat Apr 4 20:10:57 2026] 127.0.0.1:60739 Closing
[Sat Apr 4 20:11:41 2026] 127.0.0.1:63735 Accepted
[Sat Apr 4 20:11:41 2026] 127.0.0.1:63735 [200]: GET /telegram/broadcast_test.php
[Sat Apr 4 20:11:41 2026] 127.0.0.1:63735 Closing
[Sat Apr 4 20:11:42 2026] 127.0.0.1:57750 Accepted
[Sat Apr 4 20:11:42 2026] 127.0.0.1:57750 [200]: GET /favicon.ico
[Sat Apr 4 20:11:42 2026] 127.0.0.1:57750 Closing
[Sat Apr 4 20:11:43 2026] 127.0.0.1:49797 Accepted
[Sat Apr 4 20:11:43 2026] 127.0.0.1:49797 [200]: GET /telegram/broadcast_test.php
[Sat Apr 4 20:11:43 2026] 127.0.0.1:49797 Closing
[Sat Apr 4 20:11:43 2026] 127.0.0.1:57009 Accepted
[Sat Apr 4 20:11:43 2026] 127.0.0.1:57009 [200]: GET /css/style.css
[Sat Apr 4 20:11:43 2026] 127.0.0.1:57009 Closing
[Sat Apr 4 20:11:44 2026] 127.0.0.1:59357 Accepted
[Sat Apr 4 20:11:44 2026] 127.0.0.1:56268 Accepted
[Sat Apr 4 20:11:44 2026] 127.0.0.1:59357 [200]: GET /images/star16x16.png
[Sat Apr 4 20:11:44 2026] 127.0.0.1:56268 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 20:11:44 2026] 127.0.0.1:59357 Closing
[Sat Apr 4 20:11:44 2026] 127.0.0.1:56268 Closing
[Sat Apr 4 20:11:44 2026] 127.0.0.1:64168 Accepted
[Sat Apr 4 20:11:45 2026] 127.0.0.1:64168 [200]: GET /favicon.ico
[Sat Apr 4 20:11:45 2026] 127.0.0.1:64168 Closing
[Sat Apr 4 20:11:45 2026] 127.0.0.1:51771 Accepted
[Sat Apr 4 20:11:45 2026] 127.0.0.1:51771 [200]: POST /telegram/broadcast_test.php
[Sat Apr 4 20:11:45 2026] 127.0.0.1:51771 Closing
[Sat Apr 4 20:11:45 2026] 127.0.0.1:53274 Accepted
[Sat Apr 4 20:11:45 2026] 127.0.0.1:53274 [200]: GET /css/style.css
[Sat Apr 4 20:11:45 2026] 127.0.0.1:53274 Closing
[Sat Apr 4 20:11:46 2026] 127.0.0.1:61053 Accepted
[Sat Apr 4 20:11:46 2026] 127.0.0.1:61053 [200]: GET /images/star16x16.png
[Sat Apr 4 20:11:46 2026] 127.0.0.1:49236 Accepted
[Sat Apr 4 20:11:46 2026] 127.0.0.1:49236 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 20:11:46 2026] 127.0.0.1:61053 Closing
[Sat Apr 4 20:11:46 2026] 127.0.0.1:49236 Closing
[Sat Apr 4 20:11:46 2026] 127.0.0.1:50467 Accepted
[Sat Apr 4 20:11:46 2026] 127.0.0.1:50467 [200]: GET /favicon.ico
[Sat Apr 4 20:11:46 2026] 127.0.0.1:50467 Closing
[Sat Apr 4 20:15:27 2026] 127.0.0.1:55582 Accepted
[Sat Apr 4 20:15:27 2026] 127.0.0.1:55582 [200]: GET /telegram/broadcast_test.php
[Sat Apr 4 20:15:27 2026] 127.0.0.1:55582 Closing
[Sat Apr 4 20:15:27 2026] 127.0.0.1:64068 Accepted
[Sat Apr 4 20:15:27 2026] 127.0.0.1:64068 [200]: GET /css/style.css
[Sat Apr 4 20:15:27 2026] 127.0.0.1:64068 Closing
[Sat Apr 4 20:15:27 2026] 127.0.0.1:63912 Accepted
[Sat Apr 4 20:15:27 2026] 127.0.0.1:63912 [200]: GET /images/star16x16.png
[Sat Apr 4 20:15:27 2026] 127.0.0.1:54947 Accepted
[Sat Apr 4 20:15:27 2026] 127.0.0.1:54947 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 20:15:27 2026] 127.0.0.1:63912 Closing
[Sat Apr 4 20:15:27 2026] 127.0.0.1:54947 Closing
[Sat Apr 4 20:15:27 2026] 127.0.0.1:51829 Accepted
[Sat Apr 4 20:15:28 2026] 127.0.0.1:51829 [200]: GET /favicon.ico
[Sat Apr 4 20:15:28 2026] 127.0.0.1:51829 Closing
[Sat Apr 4 20:15:49 2026] 127.0.0.1:63140 Accepted
[Sat Apr 4 20:15:49 2026] PHP Warning: Undefined variable $ErrorActionPreference in C:\Users\ich\source\repos\skyview.astronomiemuseum.de\public\telegram\broadcast_test.php on line 77
= : Die Benennung "=" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausf�hrbaren
Programms erkannt. šberpr�fen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und
wiederholen Sie den Vorgang.
In Zeile:1 Zeichen:2
+ = 'Stop'
+ ~
+ CategoryInfo : ObjectNotFound: (=:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
[Sat Apr 4 20:15:50 2026] 127.0.0.1:63140 [200]: POST /telegram/broadcast_test.php
[Sat Apr 4 20:15:50 2026] 127.0.0.1:63140 Closing
[Sat Apr 4 20:15:50 2026] 127.0.0.1:56354 Accepted
[Sat Apr 4 20:15:50 2026] 127.0.0.1:56354 [200]: GET /css/style.css
[Sat Apr 4 20:15:50 2026] 127.0.0.1:56354 Closing
[Sat Apr 4 20:15:50 2026] 127.0.0.1:57107 Accepted
[Sat Apr 4 20:15:50 2026] 127.0.0.1:63396 Accepted
[Sat Apr 4 20:15:50 2026] 127.0.0.1:57107 [200]: GET /images/star16x16.png
[Sat Apr 4 20:15:50 2026] 127.0.0.1:63396 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 20:15:50 2026] 127.0.0.1:57107 Closing
[Sat Apr 4 20:15:50 2026] 127.0.0.1:63396 Closing
[Sat Apr 4 20:15:50 2026] 127.0.0.1:55764 Accepted
[Sat Apr 4 20:15:51 2026] 127.0.0.1:55764 [200]: GET /favicon.ico
[Sat Apr 4 20:15:51 2026] 127.0.0.1:55764 Closing
[Sat Apr 4 20:16:40 2026] 127.0.0.1:55289 Accepted
[Sat Apr 4 20:16:40 2026] 127.0.0.1:55289 [200]: GET /telegram/broadcast_test.php
[Sat Apr 4 20:16:40 2026] 127.0.0.1:55289 Closing
[Sat Apr 4 20:16:40 2026] 127.0.0.1:58669 Accepted
[Sat Apr 4 20:16:40 2026] 127.0.0.1:58669 [200]: GET /css/style.css
[Sat Apr 4 20:16:40 2026] 127.0.0.1:58669 Closing
[Sat Apr 4 20:16:40 2026] 127.0.0.1:50546 Accepted
[Sat Apr 4 20:16:40 2026] 127.0.0.1:50546 [200]: GET /images/star16x16.png
[Sat Apr 4 20:16:40 2026] 127.0.0.1:51858 Accepted
[Sat Apr 4 20:16:40 2026] 127.0.0.1:51858 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 20:16:40 2026] 127.0.0.1:50546 Closing
[Sat Apr 4 20:16:40 2026] 127.0.0.1:51858 Closing
[Sat Apr 4 20:16:40 2026] 127.0.0.1:54376 Accepted
[Sat Apr 4 20:16:41 2026] 127.0.0.1:54376 [200]: GET /favicon.ico
[Sat Apr 4 20:16:41 2026] 127.0.0.1:54376 Closing
[Sat Apr 4 20:16:49 2026] 127.0.0.1:61162 Accepted
[Sat Apr 4 20:16:49 2026] 127.0.0.1:61162 [200]: POST /telegram/broadcast_test.php
[Sat Apr 4 20:16:49 2026] 127.0.0.1:61162 Closing
[Sat Apr 4 20:16:49 2026] 127.0.0.1:49802 Accepted
[Sat Apr 4 20:16:49 2026] 127.0.0.1:49802 [200]: GET /css/style.css
[Sat Apr 4 20:16:49 2026] 127.0.0.1:49802 Closing
[Sat Apr 4 20:16:49 2026] 127.0.0.1:65086 Accepted
[Sat Apr 4 20:16:49 2026] 127.0.0.1:65086 [200]: GET /images/star16x16.png
[Sat Apr 4 20:16:49 2026] 127.0.0.1:65460 Accepted
[Sat Apr 4 20:16:49 2026] 127.0.0.1:65460 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 20:16:49 2026] 127.0.0.1:65086 Closing
[Sat Apr 4 20:16:49 2026] 127.0.0.1:65460 Closing
[Sat Apr 4 20:16:49 2026] 127.0.0.1:63450 Accepted
[Sat Apr 4 20:16:50 2026] 127.0.0.1:63450 [200]: GET /favicon.ico
[Sat Apr 4 20:16:50 2026] 127.0.0.1:63450 Closing
[Sat Apr 4 20:18:27 2026] 127.0.0.1:55134 Accepted
[Sat Apr 4 20:18:27 2026] 127.0.0.1:55134 [200]: GET /telegram/broadcast_test.php
[Sat Apr 4 20:18:27 2026] 127.0.0.1:55134 Closing
[Sat Apr 4 20:18:27 2026] 127.0.0.1:59680 Accepted
[Sat Apr 4 20:18:27 2026] 127.0.0.1:59680 [200]: GET /css/style.css
[Sat Apr 4 20:18:27 2026] 127.0.0.1:59680 Closing
[Sat Apr 4 20:18:27 2026] 127.0.0.1:62473 Accepted
[Sat Apr 4 20:18:27 2026] 127.0.0.1:62473 [200]: GET /images/star16x16.png
[Sat Apr 4 20:18:27 2026] 127.0.0.1:59162 Accepted
[Sat Apr 4 20:18:27 2026] 127.0.0.1:59162 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 20:18:27 2026] 127.0.0.1:62473 Closing
[Sat Apr 4 20:18:27 2026] 127.0.0.1:59162 Closing
[Sat Apr 4 20:18:27 2026] 127.0.0.1:65020 Accepted
[Sat Apr 4 20:18:28 2026] 127.0.0.1:65020 [200]: GET /favicon.ico
[Sat Apr 4 20:18:28 2026] 127.0.0.1:65020 Closing
[Sat Apr 4 20:18:31 2026] 127.0.0.1:57969 Accepted
#< CLIXML
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04"><Obj S="progress" RefId="0"><TN RefId="0"><T>System.Management.Automation.PSCustomObject</T><T>System.Object</T></TN><MS><I64 N="SourceId">1</I64><PR N="Record"><AV>Module werden f�r erstmalige Verwendung vorbereitet.</AV><AI>0</AI><Nil /><PI>-1</PI><PC>-1</PC><T>Completed</T><SR>-1</SR><SD> </SD></PR></MS></Obj></Objs>[Sat Apr 4 20:18:31 2026] 127.0.0.1:57969 [200]: POST /telegram/broadcast_test.php
[Sat Apr 4 20:18:31 2026] 127.0.0.1:57969 Closing
[Sat Apr 4 20:18:31 2026] 127.0.0.1:49876 Accepted
[Sat Apr 4 20:18:31 2026] 127.0.0.1:49876 [200]: GET /css/style.css
[Sat Apr 4 20:18:31 2026] 127.0.0.1:49876 Closing
[Sat Apr 4 20:18:31 2026] 127.0.0.1:64150 Accepted
[Sat Apr 4 20:18:31 2026] 127.0.0.1:64150 [200]: GET /images/star16x16.png
[Sat Apr 4 20:18:31 2026] 127.0.0.1:56561 Accepted
[Sat Apr 4 20:18:31 2026] 127.0.0.1:56561 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 20:18:31 2026] 127.0.0.1:64150 Closing
[Sat Apr 4 20:18:31 2026] 127.0.0.1:56561 Closing
[Sat Apr 4 20:18:32 2026] 127.0.0.1:60491 Accepted
[Sat Apr 4 20:18:32 2026] 127.0.0.1:60491 [200]: GET /favicon.ico
[Sat Apr 4 20:18:32 2026] 127.0.0.1:60491 Closing
+2
View File
@@ -0,0 +1,2 @@
<br />
<b>Warning</b>: Module "mysqli" is already loaded in <b>Unknown</b> on line <b>0</b><br />
+28 -4
View File
@@ -482,10 +482,11 @@ CREATE TABLE IF NOT EXISTS `moon_craters` (
-- Daten-Export vom Benutzer nicht ausgewählt
-- Exportiere Struktur von Tabelle d0467f49.sat_import_runs
CREATE TABLE IF NOT EXISTS `sat_import_runs` (
-- Exportiere Struktur von Tabelle d0467f49.app_import_runs
CREATE TABLE IF NOT EXISTS `app_import_runs` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`source` varchar(32) NOT NULL,
`source_url` varchar(500) DEFAULT NULL,
`started_at` datetime NOT NULL,
`finished_at` datetime DEFAULT NULL,
`records_received` int(11) NOT NULL DEFAULT 0,
@@ -494,8 +495,8 @@ CREATE TABLE IF NOT EXISTS `sat_import_runs` (
`status` varchar(32) NOT NULL,
`message` text DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_sat_import_runs_source` (`source`),
KEY `idx_sat_import_runs_started_at` (`started_at`)
KEY `idx_app_import_runs_source` (`source`),
KEY `idx_app_import_runs_started_at` (`started_at`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Daten-Export vom Benutzer nicht ausgewählt
@@ -638,6 +639,29 @@ CREATE TABLE IF NOT EXISTS `star_hipparcos` (
-- Daten-Export vom Benutzer nicht ausgewählt
-- Exportiere Struktur von Tabelle d0467f49.aavso_tcrb_observations
CREATE TABLE IF NOT EXISTS `aavso_tcrb_observations` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`source_row_key` varchar(50) DEFAULT NULL,
`star_name` varchar(50) NOT NULL DEFAULT 'T CrB',
`jd` decimal(16,6) NOT NULL,
`observed_at_utc` datetime NOT NULL,
`calendar_date_text` varchar(64) DEFAULT NULL,
`magnitude` decimal(8,3) NOT NULL,
`magnitude_error` decimal(8,3) DEFAULT NULL,
`filter_code` varchar(20) DEFAULT NULL,
`observer_code` varchar(20) DEFAULT NULL,
`notes_raw` longtext DEFAULT NULL,
`imported_at` datetime NOT NULL DEFAULT current_timestamp(),
`created_at` datetime NOT NULL DEFAULT current_timestamp(),
`updated_at` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`id`),
UNIQUE KEY `uq_aavso_tcrb_observation` (`jd`,`filter_code`,`observer_code`),
KEY `idx_aavso_tcrb_observed_at_utc` (`observed_at_utc`),
KEY `idx_aavso_tcrb_filter_code` (`filter_code`),
KEY `idx_aavso_tcrb_observer_code` (`observer_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='AAVSO WebObs CCD-Beobachtungen fuer T CrB';
/*!40103 SET TIME_ZONE=IFNULL(@OLD_TIME_ZONE, 'system') */;
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IFNULL(@OLD_FOREIGN_KEY_CHECKS, 1) */;
+434
View File
@@ -0,0 +1,434 @@
[Sun Apr 5 08:41:18 2026] PHP Warning: Module "mysqli" is already loaded in Unknown on line 0
[Sun Apr 5 08:41:18 2026] PHP 8.4.5 Development Server (http://127.0.0.1:8000) started
[Sun Apr 5 08:41:20 2026] 127.0.0.1:56954 Accepted
[Sun Apr 5 08:41:20 2026] 127.0.0.1:56954 [200]: GET /
[Sun Apr 5 08:41:20 2026] 127.0.0.1:56954 Closing
[Sun Apr 5 08:41:47 2026] 127.0.0.1:56958 Accepted
[Sun Apr 5 08:41:47 2026] 127.0.0.1:56958 [200]: GET /
[Sun Apr 5 08:41:47 2026] 127.0.0.1:56958 Closing
[Sun Apr 5 09:03:20 2026] 127.0.0.1:58699 Accepted
[Sun Apr 5 09:03:21 2026] 127.0.0.1:58699 [200]: GET /tcrb_lightcurve.php
[Sun Apr 5 09:03:22 2026] 127.0.0.1:58699 Closing
[Sun Apr 5 09:04:28 2026] 127.0.0.1:57870 Accepted
[Sun Apr 5 09:04:29 2026] 127.0.0.1:57870 [200]: GET /
[Sun Apr 5 09:04:29 2026] 127.0.0.1:57870 Closing
[Sun Apr 5 09:04:29 2026] 127.0.0.1:59118 Accepted
[Sun Apr 5 09:04:29 2026] 127.0.0.1:59118 [200]: GET /css/style.css
[Sun Apr 5 09:04:29 2026] 127.0.0.1:59118 Closing
[Sun Apr 5 09:04:29 2026] 127.0.0.1:50781 Accepted
[Sun Apr 5 09:04:29 2026] 127.0.0.1:62400 Accepted
[Sun Apr 5 09:04:29 2026] 127.0.0.1:50781 [200]: GET /images/star16x16.png
[Sun Apr 5 09:04:29 2026] 127.0.0.1:62400 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:04:29 2026] 127.0.0.1:50781 Closing
[Sun Apr 5 09:04:29 2026] 127.0.0.1:62400 Closing
[Sun Apr 5 09:04:29 2026] 127.0.0.1:50410 Accepted
[Sun Apr 5 09:04:30 2026] 127.0.0.1:50410 [200]: GET /favicon.ico
[Sun Apr 5 09:04:30 2026] 127.0.0.1:50410 Closing
[Sun Apr 5 09:04:30 2026] 127.0.0.1:58330 Accepted
[Sun Apr 5 09:04:33 2026] 127.0.0.1:58331 Accepted
[Sun Apr 5 09:04:33 2026] 127.0.0.1:58331 [200]: GET /tcrb_lightcurve.php
[Sun Apr 5 09:04:34 2026] 127.0.0.1:58331 Closing
[Sun Apr 5 09:04:34 2026] 127.0.0.1:58330 [200]: GET /tcrb_lightcurve.php
[Sun Apr 5 09:04:34 2026] 127.0.0.1:58330 Closing
[Sun Apr 5 09:04:35 2026] 127.0.0.1:54593 Accepted
[Sun Apr 5 09:04:35 2026] 127.0.0.1:54593 [200]: GET /css/style.css
[Sun Apr 5 09:04:35 2026] 127.0.0.1:54593 Closing
[Sun Apr 5 09:04:35 2026] 127.0.0.1:62799 Accepted
[Sun Apr 5 09:04:35 2026] 127.0.0.1:62898 Accepted
[Sun Apr 5 09:04:35 2026] 127.0.0.1:62799 [200]: GET /images/star16x16.png
[Sun Apr 5 09:04:35 2026] 127.0.0.1:62898 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:04:35 2026] 127.0.0.1:62799 Closing
[Sun Apr 5 09:04:35 2026] 127.0.0.1:62898 Closing
[Sun Apr 5 09:04:35 2026] 127.0.0.1:57032 Accepted
[Sun Apr 5 09:04:36 2026] 127.0.0.1:57032 [200]: GET /favicon.ico
[Sun Apr 5 09:04:36 2026] 127.0.0.1:57032 Closing
[Sun Apr 5 09:04:36 2026] 127.0.0.1:52221 Accepted
[Sun Apr 5 09:05:00 2026] 127.0.0.1:52221 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B&filters%5B%5D=I&filters%5B%5D=R&filters%5B%5D=Red-Vis.&filters%5B%5D=SG&filters%5B%5D=SI&filters%5B%5D=SR&filters%5B%5D=SU&filters%5B%5D=TB&filters%5B%5D=TG&filters%5B%5D=TR&filters%5B%5D=U&filters%5B%5D=V&filters%5B%5D=Vis.
[Sun Apr 5 09:05:00 2026] 127.0.0.1:52221 Closing
[Sun Apr 5 09:05:00 2026] 127.0.0.1:51545 Accepted
[Sun Apr 5 09:05:00 2026] 127.0.0.1:51545 [200]: GET /css/style.css
[Sun Apr 5 09:05:00 2026] 127.0.0.1:51545 Closing
[Sun Apr 5 09:05:00 2026] 127.0.0.1:57177 Accepted
[Sun Apr 5 09:05:00 2026] 127.0.0.1:51353 Accepted
[Sun Apr 5 09:05:00 2026] 127.0.0.1:57177 [200]: GET /images/star16x16.png
[Sun Apr 5 09:05:00 2026] 127.0.0.1:51353 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:05:00 2026] 127.0.0.1:57177 Closing
[Sun Apr 5 09:05:00 2026] 127.0.0.1:51353 Closing
[Sun Apr 5 09:05:01 2026] 127.0.0.1:64241 Accepted
[Sun Apr 5 09:05:01 2026] 127.0.0.1:64241 [200]: GET /favicon.ico
[Sun Apr 5 09:05:01 2026] 127.0.0.1:64241 Closing
[Sun Apr 5 09:05:01 2026] 127.0.0.1:50264 Accepted
[Sun Apr 5 09:06:21 2026] 127.0.0.1:50264 Closed without sending a request; it was probably just an unused speculative preconnection
[Sun Apr 5 09:06:21 2026] 127.0.0.1:50264 Closing
[Sun Apr 5 09:06:21 2026] 127.0.0.1:58191 Accepted
[Sun Apr 5 09:06:21 2026] 127.0.0.1:58191 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B
[Sun Apr 5 09:06:21 2026] 127.0.0.1:58191 Closing
[Sun Apr 5 09:06:21 2026] 127.0.0.1:63650 Accepted
[Sun Apr 5 09:06:21 2026] 127.0.0.1:63650 [200]: GET /css/style.css
[Sun Apr 5 09:06:21 2026] 127.0.0.1:63650 Closing
[Sun Apr 5 09:06:22 2026] 127.0.0.1:64805 Accepted
[Sun Apr 5 09:06:22 2026] 127.0.0.1:64244 Accepted
[Sun Apr 5 09:06:22 2026] 127.0.0.1:64805 [200]: GET /images/star16x16.png
[Sun Apr 5 09:06:22 2026] 127.0.0.1:64244 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:06:22 2026] 127.0.0.1:64805 Closing
[Sun Apr 5 09:06:22 2026] 127.0.0.1:64244 Closing
[Sun Apr 5 09:06:22 2026] 127.0.0.1:63043 Accepted
[Sun Apr 5 09:06:23 2026] 127.0.0.1:63043 [200]: GET /favicon.ico
[Sun Apr 5 09:06:23 2026] 127.0.0.1:63043 Closing
[Sun Apr 5 09:06:23 2026] 127.0.0.1:56378 Accepted
[Sun Apr 5 09:06:32 2026] 127.0.0.1:56378 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B&filters%5B%5D=V
[Sun Apr 5 09:06:32 2026] 127.0.0.1:56378 Closing
[Sun Apr 5 09:06:33 2026] 127.0.0.1:55344 Accepted
[Sun Apr 5 09:06:33 2026] 127.0.0.1:55344 [200]: GET /css/style.css
[Sun Apr 5 09:06:33 2026] 127.0.0.1:55344 Closing
[Sun Apr 5 09:06:33 2026] 127.0.0.1:62793 Accepted
[Sun Apr 5 09:06:33 2026] 127.0.0.1:50086 Accepted
[Sun Apr 5 09:06:33 2026] 127.0.0.1:62793 [200]: GET /images/star16x16.png
[Sun Apr 5 09:06:33 2026] 127.0.0.1:50086 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:06:33 2026] 127.0.0.1:62793 Closing
[Sun Apr 5 09:06:33 2026] 127.0.0.1:50086 Closing
[Sun Apr 5 09:06:33 2026] 127.0.0.1:53067 Accepted
[Sun Apr 5 09:06:34 2026] 127.0.0.1:53067 [200]: GET /favicon.ico
[Sun Apr 5 09:06:34 2026] 127.0.0.1:53067 Closing
[Sun Apr 5 09:06:34 2026] 127.0.0.1:64617 Accepted
[Sun Apr 5 09:06:51 2026] 127.0.0.1:64617 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B&filters%5B%5D=V
[Sun Apr 5 09:06:51 2026] 127.0.0.1:64617 Closing
[Sun Apr 5 09:06:52 2026] 127.0.0.1:56300 Accepted
[Sun Apr 5 09:06:52 2026] 127.0.0.1:56300 [200]: GET /css/style.css
[Sun Apr 5 09:06:52 2026] 127.0.0.1:56300 Closing
[Sun Apr 5 09:06:52 2026] 127.0.0.1:56087 Accepted
[Sun Apr 5 09:06:52 2026] 127.0.0.1:61670 Accepted
[Sun Apr 5 09:06:52 2026] 127.0.0.1:56087 [200]: GET /images/star16x16.png
[Sun Apr 5 09:06:52 2026] 127.0.0.1:61670 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:06:52 2026] 127.0.0.1:56087 Closing
[Sun Apr 5 09:06:52 2026] 127.0.0.1:61670 Closing
[Sun Apr 5 09:06:52 2026] 127.0.0.1:50474 Accepted
[Sun Apr 5 09:06:53 2026] 127.0.0.1:50474 [200]: GET /favicon.ico
[Sun Apr 5 09:06:53 2026] 127.0.0.1:50474 Closing
[Sun Apr 5 09:06:53 2026] 127.0.0.1:57647 Accepted
[Sun Apr 5 09:07:15 2026] 127.0.0.1:57647 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B&filters%5B%5D=V
[Sun Apr 5 09:07:15 2026] 127.0.0.1:57647 Closing
[Sun Apr 5 09:07:15 2026] 127.0.0.1:50671 Accepted
[Sun Apr 5 09:07:15 2026] 127.0.0.1:50671 [200]: GET /css/style.css
[Sun Apr 5 09:07:15 2026] 127.0.0.1:50671 Closing
[Sun Apr 5 09:07:15 2026] 127.0.0.1:63305 Accepted
[Sun Apr 5 09:07:15 2026] 127.0.0.1:63305 [200]: GET /images/star16x16.png
[Sun Apr 5 09:07:15 2026] 127.0.0.1:63305 Closing
[Sun Apr 5 09:07:15 2026] 127.0.0.1:63643 Accepted
[Sun Apr 5 09:07:15 2026] 127.0.0.1:60051 Accepted
[Sun Apr 5 09:07:15 2026] 127.0.0.1:63643 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:07:15 2026] 127.0.0.1:63643 Closing
[Sun Apr 5 09:07:16 2026] 127.0.0.1:60051 [200]: GET /favicon.ico
[Sun Apr 5 09:07:16 2026] 127.0.0.1:60051 Closing
[Sun Apr 5 09:07:26 2026] 127.0.0.1:60054 Accepted
[Sun Apr 5 09:07:27 2026] 127.0.0.1:60054 [200]: GET /tcrb_lightcurve.php
[Sun Apr 5 09:07:28 2026] 127.0.0.1:60054 Closing
[Sun Apr 5 09:07:32 2026] 127.0.0.1:64959 Accepted
[Sun Apr 5 09:07:33 2026] 127.0.0.1:64959 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B&filters%5B%5D=V
[Sun Apr 5 09:07:33 2026] 127.0.0.1:64959 Closing
[Sun Apr 5 09:07:33 2026] 127.0.0.1:52027 Accepted
[Sun Apr 5 09:07:33 2026] 127.0.0.1:52027 [200]: GET /css/style.css
[Sun Apr 5 09:07:33 2026] 127.0.0.1:52027 Closing
[Sun Apr 5 09:07:33 2026] 127.0.0.1:63633 Accepted
[Sun Apr 5 09:07:33 2026] 127.0.0.1:57816 Accepted
[Sun Apr 5 09:07:33 2026] 127.0.0.1:63633 [200]: GET /images/star16x16.png
[Sun Apr 5 09:07:33 2026] 127.0.0.1:57816 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:07:33 2026] 127.0.0.1:63633 Closing
[Sun Apr 5 09:07:33 2026] 127.0.0.1:57816 Closing
[Sun Apr 5 09:07:33 2026] 127.0.0.1:64706 Accepted
[Sun Apr 5 09:07:34 2026] 127.0.0.1:64706 [200]: GET /favicon.ico
[Sun Apr 5 09:07:34 2026] 127.0.0.1:64706 Closing
[Sun Apr 5 09:07:34 2026] 127.0.0.1:57213 Accepted
[Sun Apr 5 09:08:22 2026] 127.0.0.1:57222 Accepted
[Sun Apr 5 09:08:22 2026] 127.0.0.1:57222 [200]: GET /tcrb_lightcurve.php
[Sun Apr 5 09:08:23 2026] 127.0.0.1:57222 Closing
[Sun Apr 5 09:08:53 2026] 127.0.0.1:57213 Closed without sending a request; it was probably just an unused speculative preconnection
[Sun Apr 5 09:08:53 2026] 127.0.0.1:57213 Closing
[Sun Apr 5 09:08:53 2026] 127.0.0.1:50203 Accepted
[Sun Apr 5 09:08:54 2026] 127.0.0.1:50203 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B&filters%5B%5D=V
[Sun Apr 5 09:08:54 2026] 127.0.0.1:50203 Closing
[Sun Apr 5 09:08:54 2026] 127.0.0.1:50103 Accepted
[Sun Apr 5 09:08:54 2026] 127.0.0.1:50103 [200]: GET /css/style.css
[Sun Apr 5 09:08:54 2026] 127.0.0.1:50103 Closing
[Sun Apr 5 09:08:54 2026] 127.0.0.1:61966 Accepted
[Sun Apr 5 09:08:54 2026] 127.0.0.1:56961 Accepted
[Sun Apr 5 09:08:54 2026] 127.0.0.1:61966 [200]: GET /images/star16x16.png
[Sun Apr 5 09:08:54 2026] 127.0.0.1:56961 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:08:54 2026] 127.0.0.1:61966 Closing
[Sun Apr 5 09:08:54 2026] 127.0.0.1:56961 Closing
[Sun Apr 5 09:08:54 2026] 127.0.0.1:61750 Accepted
[Sun Apr 5 09:08:55 2026] 127.0.0.1:61750 [200]: GET /favicon.ico
[Sun Apr 5 09:08:55 2026] 127.0.0.1:61750 Closing
[Sun Apr 5 09:08:55 2026] 127.0.0.1:65247 Accepted
[Sun Apr 5 09:09:04 2026] 127.0.0.1:65247 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B
[Sun Apr 5 09:09:04 2026] 127.0.0.1:65247 Closing
[Sun Apr 5 09:09:04 2026] 127.0.0.1:62953 Accepted
[Sun Apr 5 09:09:04 2026] 127.0.0.1:62953 [200]: GET /css/style.css
[Sun Apr 5 09:09:04 2026] 127.0.0.1:62953 Closing
[Sun Apr 5 09:09:04 2026] 127.0.0.1:59789 Accepted
[Sun Apr 5 09:09:04 2026] 127.0.0.1:59789 [200]: GET /images/star16x16.png
[Sun Apr 5 09:09:04 2026] 127.0.0.1:59789 Closing
[Sun Apr 5 09:09:04 2026] 127.0.0.1:55683 Accepted
[Sun Apr 5 09:09:04 2026] 127.0.0.1:55310 Accepted
[Sun Apr 5 09:09:04 2026] 127.0.0.1:55683 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:09:04 2026] 127.0.0.1:55683 Closing
[Sun Apr 5 09:09:05 2026] 127.0.0.1:55310 [200]: GET /favicon.ico
[Sun Apr 5 09:09:05 2026] 127.0.0.1:55310 Closing
[Sun Apr 5 09:12:33 2026] 127.0.0.1:50465 Accepted
[Sun Apr 5 09:12:33 2026] 127.0.0.1:50465 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B
[Sun Apr 5 09:12:33 2026] 127.0.0.1:50465 Closing
[Sun Apr 5 09:12:33 2026] 127.0.0.1:62337 Accepted
[Sun Apr 5 09:12:33 2026] 127.0.0.1:62337 [200]: GET /css/style.css
[Sun Apr 5 09:12:33 2026] 127.0.0.1:62337 Closing
[Sun Apr 5 09:12:33 2026] 127.0.0.1:62888 Accepted
[Sun Apr 5 09:12:33 2026] 127.0.0.1:53230 Accepted
[Sun Apr 5 09:12:33 2026] 127.0.0.1:62888 [200]: GET /images/star16x16.png
[Sun Apr 5 09:12:33 2026] 127.0.0.1:53230 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:12:33 2026] 127.0.0.1:62888 Closing
[Sun Apr 5 09:12:33 2026] 127.0.0.1:53230 Closing
[Sun Apr 5 09:12:34 2026] 127.0.0.1:50620 Accepted
[Sun Apr 5 09:12:34 2026] 127.0.0.1:50620 [200]: GET /favicon.ico
[Sun Apr 5 09:12:34 2026] 127.0.0.1:50620 Closing
[Sun Apr 5 09:12:34 2026] 127.0.0.1:58601 Accepted
[Sun Apr 5 09:13:55 2026] 127.0.0.1:58601 Closed without sending a request; it was probably just an unused speculative preconnection
[Sun Apr 5 09:13:55 2026] 127.0.0.1:58601 Closing
[Sun Apr 5 09:14:02 2026] 127.0.0.1:58126 Accepted
[Sun Apr 5 09:14:02 2026] 127.0.0.1:58126 [200]: GET /tcrb_lightcurve.php
[Sun Apr 5 09:14:03 2026] 127.0.0.1:58126 Closing
[Sun Apr 5 09:16:48 2026] 127.0.0.1:56884 Accepted
[Sun Apr 5 09:16:48 2026] 127.0.0.1:56884 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B
[Sun Apr 5 09:16:48 2026] 127.0.0.1:56884 Closing
[Sun Apr 5 09:16:48 2026] 127.0.0.1:51727 Accepted
[Sun Apr 5 09:16:48 2026] 127.0.0.1:51727 [200]: GET /css/style.css
[Sun Apr 5 09:16:48 2026] 127.0.0.1:51727 Closing
[Sun Apr 5 09:16:49 2026] 127.0.0.1:61828 Accepted
[Sun Apr 5 09:16:49 2026] 127.0.0.1:60727 Accepted
[Sun Apr 5 09:16:49 2026] 127.0.0.1:61828 [200]: GET /images/star16x16.png
[Sun Apr 5 09:16:49 2026] 127.0.0.1:60727 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:16:49 2026] 127.0.0.1:61828 Closing
[Sun Apr 5 09:16:49 2026] 127.0.0.1:60727 Closing
[Sun Apr 5 09:16:49 2026] 127.0.0.1:51536 Accepted
[Sun Apr 5 09:16:50 2026] 127.0.0.1:51536 [200]: GET /favicon.ico
[Sun Apr 5 09:16:50 2026] 127.0.0.1:51536 Closing
[Sun Apr 5 09:16:50 2026] 127.0.0.1:58994 Accepted
[Sun Apr 5 09:17:36 2026] 127.0.0.1:58994 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B&filters%5B%5D=V
[Sun Apr 5 09:17:36 2026] 127.0.0.1:58994 Closing
[Sun Apr 5 09:17:36 2026] 127.0.0.1:65289 Accepted
[Sun Apr 5 09:17:36 2026] 127.0.0.1:65289 [200]: GET /css/style.css
[Sun Apr 5 09:17:36 2026] 127.0.0.1:65289 Closing
[Sun Apr 5 09:17:37 2026] 127.0.0.1:54338 Accepted
[Sun Apr 5 09:17:37 2026] 127.0.0.1:54338 [200]: GET /images/star16x16.png
[Sun Apr 5 09:17:37 2026] 127.0.0.1:54338 Closing
[Sun Apr 5 09:17:37 2026] 127.0.0.1:62997 Accepted
[Sun Apr 5 09:17:37 2026] 127.0.0.1:51304 Accepted
[Sun Apr 5 09:17:37 2026] 127.0.0.1:62997 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:17:37 2026] 127.0.0.1:62997 Closing
[Sun Apr 5 09:17:38 2026] 127.0.0.1:51304 [200]: GET /favicon.ico
[Sun Apr 5 09:17:38 2026] 127.0.0.1:51304 Closing
[Sun Apr 5 09:18:21 2026] 127.0.0.1:49914 Accepted
[Sun Apr 5 09:18:21 2026] 127.0.0.1:49914 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=V&filters%5B%5D=Vis.
[Sun Apr 5 09:18:21 2026] 127.0.0.1:49914 Closing
[Sun Apr 5 09:18:21 2026] 127.0.0.1:51379 Accepted
[Sun Apr 5 09:18:21 2026] 127.0.0.1:51379 [200]: GET /css/style.css
[Sun Apr 5 09:18:21 2026] 127.0.0.1:51379 Closing
[Sun Apr 5 09:18:21 2026] 127.0.0.1:53012 Accepted
[Sun Apr 5 09:18:21 2026] 127.0.0.1:64244 Accepted
[Sun Apr 5 09:18:21 2026] 127.0.0.1:53012 [200]: GET /images/star16x16.png
[Sun Apr 5 09:18:21 2026] 127.0.0.1:64244 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:18:21 2026] 127.0.0.1:53012 Closing
[Sun Apr 5 09:18:21 2026] 127.0.0.1:64244 Closing
[Sun Apr 5 09:18:21 2026] 127.0.0.1:59012 Accepted
[Sun Apr 5 09:18:22 2026] 127.0.0.1:59012 [200]: GET /favicon.ico
[Sun Apr 5 09:18:22 2026] 127.0.0.1:59012 Closing
[Sun Apr 5 09:18:22 2026] 127.0.0.1:49511 Accepted
[Sun Apr 5 09:18:34 2026] 127.0.0.1:49511 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=V
[Sun Apr 5 09:18:34 2026] 127.0.0.1:49511 Closing
[Sun Apr 5 09:18:34 2026] 127.0.0.1:53689 Accepted
[Sun Apr 5 09:18:34 2026] 127.0.0.1:53689 [200]: GET /css/style.css
[Sun Apr 5 09:18:34 2026] 127.0.0.1:53689 Closing
[Sun Apr 5 09:18:35 2026] 127.0.0.1:53724 Accepted
[Sun Apr 5 09:18:35 2026] 127.0.0.1:53724 [200]: GET /images/star16x16.png
[Sun Apr 5 09:18:35 2026] 127.0.0.1:53724 Closing
[Sun Apr 5 09:18:35 2026] 127.0.0.1:57912 Accepted
[Sun Apr 5 09:18:35 2026] 127.0.0.1:54204 Accepted
[Sun Apr 5 09:18:35 2026] 127.0.0.1:57912 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:18:35 2026] 127.0.0.1:57912 Closing
[Sun Apr 5 09:18:36 2026] 127.0.0.1:54204 [200]: GET /favicon.ico
[Sun Apr 5 09:18:36 2026] 127.0.0.1:54204 Closing
[Sun Apr 5 09:19:09 2026] 127.0.0.1:60535 Accepted
[Sun Apr 5 09:19:09 2026] 127.0.0.1:60535 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=CV&filters%5B%5D=V
[Sun Apr 5 09:19:09 2026] 127.0.0.1:60535 Closing
[Sun Apr 5 09:19:09 2026] 127.0.0.1:55329 Accepted
[Sun Apr 5 09:19:09 2026] 127.0.0.1:55329 [200]: GET /css/style.css
[Sun Apr 5 09:19:09 2026] 127.0.0.1:55329 Closing
[Sun Apr 5 09:19:09 2026] 127.0.0.1:56639 Accepted
[Sun Apr 5 09:19:09 2026] 127.0.0.1:61824 Accepted
[Sun Apr 5 09:19:09 2026] 127.0.0.1:56639 [200]: GET /images/star16x16.png
[Sun Apr 5 09:19:09 2026] 127.0.0.1:61824 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:19:09 2026] 127.0.0.1:56639 Closing
[Sun Apr 5 09:19:09 2026] 127.0.0.1:61824 Closing
[Sun Apr 5 09:19:10 2026] 127.0.0.1:61125 Accepted
[Sun Apr 5 09:19:10 2026] 127.0.0.1:61125 [200]: GET /favicon.ico
[Sun Apr 5 09:19:10 2026] 127.0.0.1:61125 Closing
[Sun Apr 5 09:19:10 2026] 127.0.0.1:52409 Accepted
[Sun Apr 5 09:19:19 2026] 127.0.0.1:52409 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=R&filters%5B%5D=V
[Sun Apr 5 09:19:19 2026] 127.0.0.1:52409 Closing
[Sun Apr 5 09:19:19 2026] 127.0.0.1:64933 Accepted
[Sun Apr 5 09:19:19 2026] 127.0.0.1:64933 [200]: GET /css/style.css
[Sun Apr 5 09:19:19 2026] 127.0.0.1:64933 Closing
[Sun Apr 5 09:19:19 2026] 127.0.0.1:54659 Accepted
[Sun Apr 5 09:19:19 2026] 127.0.0.1:54659 [200]: GET /images/star16x16.png
[Sun Apr 5 09:19:19 2026] 127.0.0.1:54659 Closing
[Sun Apr 5 09:19:19 2026] 127.0.0.1:56306 Accepted
[Sun Apr 5 09:19:19 2026] 127.0.0.1:59001 Accepted
[Sun Apr 5 09:19:19 2026] 127.0.0.1:56306 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:19:19 2026] 127.0.0.1:56306 Closing
[Sun Apr 5 09:19:20 2026] 127.0.0.1:59001 [200]: GET /favicon.ico
[Sun Apr 5 09:19:20 2026] 127.0.0.1:59001 Closing
[Sun Apr 5 09:19:28 2026] 127.0.0.1:51610 Accepted
[Sun Apr 5 09:19:28 2026] 127.0.0.1:51610 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=SU&filters%5B%5D=V
[Sun Apr 5 09:19:28 2026] 127.0.0.1:51610 Closing
[Sun Apr 5 09:19:28 2026] 127.0.0.1:58168 Accepted
[Sun Apr 5 09:19:28 2026] 127.0.0.1:58168 [200]: GET /css/style.css
[Sun Apr 5 09:19:28 2026] 127.0.0.1:58168 Closing
[Sun Apr 5 09:19:28 2026] 127.0.0.1:59299 Accepted
[Sun Apr 5 09:19:28 2026] 127.0.0.1:57058 Accepted
[Sun Apr 5 09:19:28 2026] 127.0.0.1:59299 [200]: GET /images/star16x16.png
[Sun Apr 5 09:19:28 2026] 127.0.0.1:57058 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:19:28 2026] 127.0.0.1:59299 Closing
[Sun Apr 5 09:19:28 2026] 127.0.0.1:57058 Closing
[Sun Apr 5 09:19:28 2026] 127.0.0.1:51123 Accepted
[Sun Apr 5 09:19:30 2026] 127.0.0.1:51123 [200]: GET /favicon.ico
[Sun Apr 5 09:19:30 2026] 127.0.0.1:51123 Closing
[Sun Apr 5 09:19:30 2026] 127.0.0.1:58163 Accepted
[Sun Apr 5 09:19:43 2026] 127.0.0.1:58163 [200]: GET /tcrb_lightcurve.php?
[Sun Apr 5 09:19:43 2026] 127.0.0.1:58163 Closing
[Sun Apr 5 09:19:43 2026] 127.0.0.1:63431 Accepted
[Sun Apr 5 09:19:43 2026] 127.0.0.1:63431 [200]: GET /css/style.css
[Sun Apr 5 09:19:43 2026] 127.0.0.1:63431 Closing
[Sun Apr 5 09:19:43 2026] 127.0.0.1:63810 Accepted
[Sun Apr 5 09:19:43 2026] 127.0.0.1:49861 Accepted
[Sun Apr 5 09:19:43 2026] 127.0.0.1:63810 [200]: GET /images/star16x16.png
[Sun Apr 5 09:19:43 2026] 127.0.0.1:63810 Closing
[Sun Apr 5 09:19:43 2026] 127.0.0.1:49861 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:19:43 2026] 127.0.0.1:49861 Closing
[Sun Apr 5 09:19:44 2026] 127.0.0.1:55189 Accepted
[Sun Apr 5 09:19:45 2026] 127.0.0.1:55189 [200]: GET /favicon.ico
[Sun Apr 5 09:19:45 2026] 127.0.0.1:55189 Closing
[Sun Apr 5 09:20:52 2026] 127.0.0.1:59913 Accepted
[Sun Apr 5 09:20:52 2026] 127.0.0.1:59913 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=V
[Sun Apr 5 09:20:52 2026] 127.0.0.1:59913 Closing
[Sun Apr 5 09:20:52 2026] 127.0.0.1:62258 Accepted
[Sun Apr 5 09:20:52 2026] 127.0.0.1:62258 [200]: GET /css/style.css
[Sun Apr 5 09:20:52 2026] 127.0.0.1:62258 Closing
[Sun Apr 5 09:20:53 2026] 127.0.0.1:58865 Accepted
[Sun Apr 5 09:20:53 2026] 127.0.0.1:55357 Accepted
[Sun Apr 5 09:20:53 2026] 127.0.0.1:58865 [200]: GET /images/star16x16.png
[Sun Apr 5 09:20:53 2026] 127.0.0.1:55357 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:20:53 2026] 127.0.0.1:58865 Closing
[Sun Apr 5 09:20:53 2026] 127.0.0.1:55357 Closing
[Sun Apr 5 09:20:53 2026] 127.0.0.1:53823 Accepted
[Sun Apr 5 09:20:54 2026] 127.0.0.1:53823 [200]: GET /favicon.ico
[Sun Apr 5 09:20:54 2026] 127.0.0.1:53823 Closing
[Sun Apr 5 09:20:54 2026] 127.0.0.1:49851 Accepted
[Sun Apr 5 09:21:56 2026] 127.0.0.1:49851 Closed without sending a request; it was probably just an unused speculative preconnection
[Sun Apr 5 09:21:56 2026] 127.0.0.1:49851 Closing
[Sun Apr 5 09:25:02 2026] 127.0.0.1:51369 Accepted
[Sun Apr 5 09:25:03 2026] 127.0.0.1:51369 [200]: GET /tcrb_lightcurve.php
[Sun Apr 5 09:25:03 2026] 127.0.0.1:51369 Closing
[Sun Apr 5 09:28:00 2026] 127.0.0.1:52013 Accepted
[Sun Apr 5 09:28:01 2026] 127.0.0.1:52013 [200]: GET /tcrb_lightcurve.php
[Sun Apr 5 09:28:01 2026] 127.0.0.1:52013 Closing
[Sun Apr 5 09:28:01 2026] 127.0.0.1:63106 Accepted
[Sun Apr 5 09:28:01 2026] 127.0.0.1:63106 [200]: GET /css/style.css
[Sun Apr 5 09:28:01 2026] 127.0.0.1:63106 Closing
[Sun Apr 5 09:28:01 2026] 127.0.0.1:55381 Accepted
[Sun Apr 5 09:28:01 2026] 127.0.0.1:53886 Accepted
[Sun Apr 5 09:28:01 2026] 127.0.0.1:55381 [200]: GET /images/star16x16.png
[Sun Apr 5 09:28:01 2026] 127.0.0.1:53886 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:28:01 2026] 127.0.0.1:55381 Closing
[Sun Apr 5 09:28:01 2026] 127.0.0.1:53886 Closing
[Sun Apr 5 09:28:01 2026] 127.0.0.1:53593 Accepted
[Sun Apr 5 09:28:04 2026] 127.0.0.1:53593 [200]: GET /favicon.ico
[Sun Apr 5 09:28:04 2026] 127.0.0.1:53593 Closing
[Sun Apr 5 09:28:28 2026] 127.0.0.1:63663 Accepted
[Sun Apr 5 09:28:28 2026] 127.0.0.1:63663 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=I&filters%5B%5D=R&filters%5B%5D=V
[Sun Apr 5 09:28:28 2026] 127.0.0.1:63663 Closing
[Sun Apr 5 09:28:28 2026] 127.0.0.1:61074 Accepted
[Sun Apr 5 09:28:28 2026] 127.0.0.1:61074 [200]: GET /css/style.css
[Sun Apr 5 09:28:28 2026] 127.0.0.1:61074 Closing
[Sun Apr 5 09:28:29 2026] 127.0.0.1:63330 Accepted
[Sun Apr 5 09:28:29 2026] 127.0.0.1:65079 Accepted
[Sun Apr 5 09:28:29 2026] 127.0.0.1:63330 [200]: GET /images/star16x16.png
[Sun Apr 5 09:28:29 2026] 127.0.0.1:65079 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:28:29 2026] 127.0.0.1:63330 Closing
[Sun Apr 5 09:28:29 2026] 127.0.0.1:65079 Closing
[Sun Apr 5 09:28:29 2026] 127.0.0.1:64619 Accepted
[Sun Apr 5 09:28:30 2026] 127.0.0.1:64619 [200]: GET /favicon.ico
[Sun Apr 5 09:28:30 2026] 127.0.0.1:64619 Closing
[Sun Apr 5 09:28:30 2026] 127.0.0.1:51060 Accepted
[Sun Apr 5 09:28:34 2026] 127.0.0.1:51060 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=V
[Sun Apr 5 09:28:34 2026] 127.0.0.1:51060 Closing
[Sun Apr 5 09:28:34 2026] 127.0.0.1:49882 Accepted
[Sun Apr 5 09:28:34 2026] 127.0.0.1:49882 [200]: GET /css/style.css
[Sun Apr 5 09:28:34 2026] 127.0.0.1:49882 Closing
[Sun Apr 5 09:28:34 2026] 127.0.0.1:57884 Accepted
[Sun Apr 5 09:28:34 2026] 127.0.0.1:57884 [200]: GET /images/star16x16.png
[Sun Apr 5 09:28:34 2026] 127.0.0.1:57884 Closing
[Sun Apr 5 09:28:34 2026] 127.0.0.1:54484 Accepted
[Sun Apr 5 09:28:34 2026] 127.0.0.1:60639 Accepted
[Sun Apr 5 09:28:34 2026] 127.0.0.1:54484 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:28:34 2026] 127.0.0.1:54484 Closing
[Sun Apr 5 09:28:36 2026] 127.0.0.1:60639 [200]: GET /favicon.ico
[Sun Apr 5 09:28:36 2026] 127.0.0.1:60639 Closing
[Sun Apr 5 09:30:04 2026] 127.0.0.1:50224 Accepted
[Sun Apr 5 09:30:04 2026] 127.0.0.1:50224 [200]: GET /tcrb_lightcurve.php
[Sun Apr 5 09:30:04 2026] 127.0.0.1:50224 Closing
[Sun Apr 5 09:31:20 2026] 127.0.0.1:51175 Accepted
[Sun Apr 5 09:31:21 2026] 127.0.0.1:51175 [200]: GET /tcrb_lightcurve.php
[Sun Apr 5 09:31:21 2026] 127.0.0.1:51175 Closing
[Sun Apr 5 09:31:21 2026] 127.0.0.1:58982 Accepted
[Sun Apr 5 09:31:21 2026] 127.0.0.1:58982 [200]: GET /css/style.css
[Sun Apr 5 09:31:21 2026] 127.0.0.1:58982 Closing
[Sun Apr 5 09:31:21 2026] 127.0.0.1:61557 Accepted
[Sun Apr 5 09:31:21 2026] 127.0.0.1:58924 Accepted
[Sun Apr 5 09:31:21 2026] 127.0.0.1:61557 [200]: GET /images/star16x16.png
[Sun Apr 5 09:31:21 2026] 127.0.0.1:58924 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:31:21 2026] 127.0.0.1:61557 Closing
[Sun Apr 5 09:31:21 2026] 127.0.0.1:58924 Closing
[Sun Apr 5 09:31:21 2026] 127.0.0.1:57822 Accepted
[Sun Apr 5 09:31:22 2026] 127.0.0.1:57822 [200]: GET /favicon.ico
[Sun Apr 5 09:31:22 2026] 127.0.0.1:57822 Closing
[Sun Apr 5 09:31:22 2026] 127.0.0.1:64591 Accepted
[Sun Apr 5 09:31:37 2026] 127.0.0.1:64591 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B&filters%5B%5D=V
[Sun Apr 5 09:31:37 2026] 127.0.0.1:64591 Closing
[Sun Apr 5 09:31:37 2026] 127.0.0.1:62566 Accepted
[Sun Apr 5 09:31:37 2026] 127.0.0.1:62566 [200]: GET /css/style.css
[Sun Apr 5 09:31:37 2026] 127.0.0.1:62566 Closing
[Sun Apr 5 09:31:38 2026] 127.0.0.1:62905 Accepted
[Sun Apr 5 09:31:38 2026] 127.0.0.1:62905 [200]: GET /images/star16x16.png
[Sun Apr 5 09:31:38 2026] 127.0.0.1:62905 Closing
[Sun Apr 5 09:31:38 2026] 127.0.0.1:61446 Accepted
[Sun Apr 5 09:31:38 2026] 127.0.0.1:58223 Accepted
[Sun Apr 5 09:31:38 2026] 127.0.0.1:61446 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:31:38 2026] 127.0.0.1:61446 Closing
[Sun Apr 5 09:31:39 2026] 127.0.0.1:58223 [200]: GET /favicon.ico
[Sun Apr 5 09:31:39 2026] 127.0.0.1:58223 Closing
[Sun Apr 5 09:31:51 2026] 127.0.0.1:51105 Accepted
[Sun Apr 5 09:31:51 2026] 127.0.0.1:51105 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=V
[Sun Apr 5 09:31:51 2026] 127.0.0.1:51105 Closing
[Sun Apr 5 09:31:51 2026] 127.0.0.1:65141 Accepted
[Sun Apr 5 09:31:51 2026] 127.0.0.1:65141 [200]: GET /css/style.css
[Sun Apr 5 09:31:51 2026] 127.0.0.1:65141 Closing
[Sun Apr 5 09:31:51 2026] 127.0.0.1:54456 Accepted
[Sun Apr 5 09:31:51 2026] 127.0.0.1:62415 Accepted
[Sun Apr 5 09:31:51 2026] 127.0.0.1:54456 [200]: GET /images/star16x16.png
[Sun Apr 5 09:31:51 2026] 127.0.0.1:62415 [200]: GET /images/star16x16_rays.png
[Sun Apr 5 09:31:51 2026] 127.0.0.1:54456 Closing
[Sun Apr 5 09:31:51 2026] 127.0.0.1:62415 Closing
[Sun Apr 5 09:31:51 2026] 127.0.0.1:58480 Accepted
[Sun Apr 5 09:31:52 2026] 127.0.0.1:58480 [200]: GET /favicon.ico
[Sun Apr 5 09:31:52 2026] 127.0.0.1:58480 Closing
[Sun Apr 5 09:31:52 2026] 127.0.0.1:63903 Accepted
[Sun Apr 5 09:32:56 2026] 127.0.0.1:63903 Closed without sending a request; it was probably just an unused speculative preconnection
[Sun Apr 5 09:32:56 2026] 127.0.0.1:63903 Closing
View File
+1
View File
@@ -55,6 +55,7 @@ $menuGroups = [
['href' => 'moonphase.php', 'label' => 'Mondphase'],
['href' => 'index_py.php', 'label' => 'Sonne & Mond'],
['href' => 'planetensichtbarkeit.php', 'label' => 'Planetensichtbarkeit'],
['href' => 'tcrb_lightcurve.php', 'label' => 'T CrB Lichtkurve'],
['href' => 'solarsystem.php', 'label' => 'Sonnensystem'],
['href' => 'jupitersystem.php', 'label' => 'Jupitersystem'],
['href' => 'tagbogen.php', 'label' => 'Tagbogen'],
+554
View File
@@ -0,0 +1,554 @@
<?php
declare(strict_types=1);
ini_set('display_errors', '1');
error_reporting(E_ALL);
session_start();
$config = require __DIR__ . '/../config/database.php';
$dsn = sprintf(
'mysql:host=%s;dbname=%s;charset=%s',
$config['host'],
$config['dbname'],
$config['charset'] ?? 'utf8mb4'
);
$pdo = new PDO(
$dsn,
$config['user'],
$config['pass'],
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]
);
$loggedIn = isset($_SESSION['user_id']);
$pageTitle = 'T CrB Lichtkurve';
$headerIntroPre = 'Variabler Stern';
$headerIntroTitle = 'T CrB Lichtkurve';
$headerIntroSub = 'AAVSO-WebObs-Daten mit waehlbaren Filtern in einem gemeinsamen Plotly-Diagramm.';
$errors = [];
function h(?string $value): string
{
return htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8');
}
$filterRows = $pdo->query("
SELECT `filter_code`, COUNT(*) AS `entry_count`
FROM `aavso_tcrb_observations`
WHERE `filter_code` IS NOT NULL
AND `filter_code` <> ''
GROUP BY `filter_code`
ORDER BY `filter_code` ASC
")->fetchAll();
$availableFilters = [];
foreach ($filterRows as $filterRow) {
$filterCode = trim((string) ($filterRow['filter_code'] ?? ''));
if ($filterCode === '') {
continue;
}
$availableFilters[] = [
'code' => $filterCode,
'count' => (int) ($filterRow['entry_count'] ?? 0),
];
}
$selectedFilters = array_values(array_unique(array_filter(array_map(
static fn ($value): string => trim((string) $value),
is_array($_GET['filters'] ?? null) ? $_GET['filters'] : []
), static fn (string $value): bool => $value !== '')));
if (empty($selectedFilters)) {
$selectedFilters = in_array('V', array_column($availableFilters, 'code'), true)
? ['V']
: array_column($availableFilters, 'code');
}
$selectedFilters = array_values(array_intersect($selectedFilters, array_column($availableFilters, 'code')));
if (empty($availableFilters)) {
$errors[] = 'In der Tabelle aavso_tcrb_observations sind noch keine T-CrB-Daten vorhanden.';
}
$observations = [];
$summary = [
'count' => 0,
'min_utc' => null,
'max_utc' => null,
'min_mag' => null,
'max_mag' => null,
];
if (empty($errors) && !empty($selectedFilters)) {
$placeholders = implode(',', array_fill(0, count($selectedFilters), '?'));
$stmt = $pdo->prepare("
SELECT
`observed_at_utc`,
`jd`,
`magnitude`,
`magnitude_error`,
`filter_code`,
`observer_code`,
`notes_raw`
FROM `aavso_tcrb_observations`
WHERE `filter_code` IN ({$placeholders})
ORDER BY `observed_at_utc` ASC, `jd` ASC
");
$stmt->execute($selectedFilters);
$rows = $stmt->fetchAll();
foreach ($rows as $row) {
$observedAtUtc = (string) ($row['observed_at_utc'] ?? '');
$magnitude = isset($row['magnitude']) ? (float) $row['magnitude'] : null;
if ($observedAtUtc === '' || $magnitude === null) {
continue;
}
$observations[] = [
'observed_at_utc' => $observedAtUtc,
'jd' => isset($row['jd']) ? (float) $row['jd'] : null,
'magnitude' => $magnitude,
'magnitude_error' => $row['magnitude_error'] !== null ? (float) $row['magnitude_error'] : null,
'filter_code' => (string) ($row['filter_code'] ?? ''),
'observer_code' => (string) ($row['observer_code'] ?? ''),
'notes_raw' => (string) ($row['notes_raw'] ?? ''),
];
$summary['count']++;
$summary['min_utc'] = $summary['min_utc'] === null || $observedAtUtc < $summary['min_utc'] ? $observedAtUtc : $summary['min_utc'];
$summary['max_utc'] = $summary['max_utc'] === null || $observedAtUtc > $summary['max_utc'] ? $observedAtUtc : $summary['max_utc'];
$summary['min_mag'] = $summary['min_mag'] === null || $magnitude < $summary['min_mag'] ? $magnitude : $summary['min_mag'];
$summary['max_mag'] = $summary['max_mag'] === null || $magnitude > $summary['max_mag'] ? $magnitude : $summary['max_mag'];
}
}
if (empty($errors) && empty($observations)) {
$errors[] = 'Fuer die ausgewaehlten Filter wurden keine Daten gefunden.';
}
$filterPalette = [
'U' => '#4c6ef5',
'B' => '#1c7ed6',
'V' => '#2b8a3e',
'R' => '#c92a2a',
'I' => '#862e9c',
'CV' => '#495057',
'TG' => '#0b7285',
'TB' => '#364fc7',
'TR' => '#d9480f',
];
$chartDatasets = [];
foreach ($selectedFilters as $selectedFilter) {
$chartDatasets[$selectedFilter] = [
'filter' => $selectedFilter,
'color' => $filterPalette[$selectedFilter] ?? sprintf('#%06X', crc32($selectedFilter) & 0xFFFFFF),
'points' => [],
];
}
foreach ($observations as $observation) {
$filterCode = $observation['filter_code'];
if (!isset($chartDatasets[$filterCode])) {
continue;
}
$chartDatasets[$filterCode]['points'][] = $observation;
}
$chartDatasets = array_values(array_filter($chartDatasets, static fn (array $dataset): bool => !empty($dataset['points'])));
$plotlyTraces = [];
foreach ($chartDatasets as $dataset) {
$xValues = [];
$yValues = [];
$errorValues = [];
$customData = [];
$hasErrors = false;
foreach ($dataset['points'] as $point) {
$xValues[] = (string) $point['observed_at_utc'];
$yValues[] = (float) $point['magnitude'];
$errorValue = $point['magnitude_error'] !== null ? (float) $point['magnitude_error'] : 0.0;
$errorValues[] = $errorValue;
if ($errorValue > 0) {
$hasErrors = true;
}
$customData[] = [
$point['jd'],
$point['observer_code'] !== '' ? $point['observer_code'] : '—',
$point['magnitude_error'] !== null ? number_format((float) $point['magnitude_error'], 3, '.', '') : '—',
];
}
$plotlyTraces[] = [
'type' => 'scatter',
'mode' => 'lines+markers',
'name' => $dataset['filter'],
'x' => $xValues,
'y' => $yValues,
'line' => [
'color' => $dataset['color'],
'width' => 2,
],
'marker' => [
'color' => $dataset['color'],
'size' => 7,
'line' => [
'color' => '#0f172a',
'width' => 1,
],
],
'error_y' => [
'type' => 'data',
'array' => $errorValues,
'visible' => $hasErrors,
'thickness' => 1.1,
'width' => 3,
'color' => $dataset['color'],
],
'customdata' => $customData,
'hovertemplate' => 'Filter %{fullData.name}<br>'
. 'Magnitude %{y:.3f}<br>'
. 'Fehler %{customdata[2]}<br>'
. 'UTC %{x}<br>'
. 'JD %{customdata[0]}<br>'
. 'Observer %{customdata[1]}<extra></extra>',
];
}
$meanSourcePoints = [];
foreach ($chartDatasets as $dataset) {
foreach ($dataset['points'] as $point) {
$meanSourcePoints[] = $point;
}
}
usort($meanSourcePoints, static function (array $a, array $b): int {
return strcmp((string) $a['observed_at_utc'], (string) $b['observed_at_utc']);
});
if (count($meanSourcePoints) >= 3) {
$windowSize = min(11, count($meanSourcePoints));
if ($windowSize % 2 === 0) {
$windowSize--;
}
$halfWindow = intdiv($windowSize, 2);
$meanX = [];
$meanY = [];
$meanCustomData = [];
foreach ($meanSourcePoints as $index => $point) {
$start = max(0, $index - $halfWindow);
$end = min(count($meanSourcePoints) - 1, $index + $halfWindow);
$sum = 0.0;
$count = 0;
for ($i = $start; $i <= $end; $i++) {
$sum += (float) $meanSourcePoints[$i]['magnitude'];
$count++;
}
if ($count === 0) {
continue;
}
$meanValue = $sum / $count;
$meanX[] = (string) $point['observed_at_utc'];
$meanY[] = $meanValue;
$meanCustomData[] = [$count];
}
if (!empty($meanX)) {
$plotlyTraces[] = [
'type' => 'scatter',
'mode' => 'lines',
'name' => 'Mittelkurve',
'x' => $meanX,
'y' => $meanY,
'line' => [
'color' => '#f4d35e',
'width' => 3,
'dash' => 'solid',
'shape' => 'spline',
'smoothing' => 0.7,
],
'customdata' => $meanCustomData,
'hovertemplate' => 'Mittelkurve<br>'
. 'Magnitude %{y:.3f}<br>'
. 'UTC %{x}<br>'
. 'Fenster %{customdata[0]} Punkte<extra></extra>',
];
}
}
$plotlyPayload = [
'traces' => $plotlyTraces,
'summary' => $summary,
];
?>
<?php require __DIR__ . '/header.php'; ?>
<script src="https://cdn.plot.ly/plotly-3.2.0.min.js" charset="utf-8"></script>
<?php if (!empty($errors)): ?>
<ul class="msg-error">
<?php foreach ($errors as $error): ?>
<li><?= h($error) ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<style>
.tcrb-layout {
display: grid;
grid-template-columns: minmax(18rem, 22rem) minmax(0, 1fr);
gap: 1.2rem;
align-items: start;
}
.tcrb-filter-list {
display: grid;
gap: 0.55rem;
}
.tcrb-filter-option {
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.8rem;
padding: 0.55rem 0.7rem;
border: 1px solid rgba(255,255,255,0.12);
border-radius: 0.7rem;
background: rgba(255,255,255,0.03);
}
.tcrb-filter-option label {
display: flex;
align-items: center;
gap: 0.55rem;
margin: 0;
cursor: pointer;
}
.tcrb-filter-swatch {
width: 0.9rem;
height: 0.9rem;
border-radius: 999px;
border: 1px solid rgba(255,255,255,0.4);
}
.tcrb-filter-count {
color: var(--text-dim);
font-size: 0.9rem;
}
.tcrb-chart-card {
overflow: hidden;
}
.tcrb-chart-wrap {
position: relative;
min-height: 32rem;
border-radius: 1rem;
background:
radial-gradient(circle at top, rgba(200, 168, 75, 0.12), transparent 45%),
linear-gradient(180deg, rgba(17, 24, 39, 0.96), rgba(7, 10, 18, 0.98));
border: 1px solid rgba(200, 168, 75, 0.2);
overflow: hidden;
}
.tcrb-plot {
width: 100%;
height: 100%;
}
.tcrb-chart-legend {
display: flex;
flex-wrap: wrap;
gap: 0.7rem 1rem;
margin-top: 1rem;
}
.tcrb-chart-legend-item {
display: inline-flex;
align-items: center;
gap: 0.45rem;
color: #dfe7ff;
font-size: 0.92rem;
}
.tcrb-chart-legend-item span {
width: 0.85rem;
height: 0.85rem;
border-radius: 999px;
}
.tcrb-summary-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 0.8rem;
margin-bottom: 1rem;
}
.tcrb-summary-box {
padding: 0.8rem 0.9rem;
border-radius: 0.9rem;
background: rgba(255,255,255,0.04);
border: 1px solid rgba(255,255,255,0.08);
}
.tcrb-summary-box strong {
display: block;
font-size: 1.05rem;
color: #f9fafb;
}
.tcrb-summary-box span {
display: block;
color: var(--text-dim);
font-size: 0.88rem;
margin-top: 0.2rem;
}
.tcrb-chart-empty {
padding: 2rem 1.2rem;
color: var(--text-dim);
}
@media (max-width: 960px) {
.tcrb-layout {
grid-template-columns: 1fr;
}
.tcrb-summary-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
</style>
<div class="tcrb-layout">
<div class="card">
<h2>Filter</h2>
<form method="get" action="" class="form-stack">
<div class="tcrb-filter-list">
<?php foreach ($availableFilters as $filter): ?>
<?php
$filterCode = $filter['code'];
$filterColor = $filterPalette[$filterCode] ?? sprintf('#%06X', crc32($filterCode) & 0xFFFFFF);
?>
<div class="tcrb-filter-option">
<label>
<input
type="checkbox"
name="filters[]"
value="<?= h($filterCode) ?>"
<?= in_array($filterCode, $selectedFilters, true) ? 'checked' : '' ?>
>
<span class="tcrb-filter-swatch" style="background: <?= h($filterColor) ?>"></span>
<span><?= h($filterCode) ?></span>
</label>
<span class="tcrb-filter-count"><?= (int) $filter['count'] ?></span>
</div>
<?php endforeach; ?>
</div>
<button type="submit" class="btn btn-primary">Diagramm aktualisieren</button>
</form>
</div>
<div class="card tcrb-chart-card">
<h2>Lichtkurve</h2>
<?php if (empty($errors) && !empty($observations)): ?>
<div class="tcrb-summary-grid">
<div class="tcrb-summary-box">
<strong><?= (int) $summary['count'] ?></strong>
<span>Messpunkte</span>
</div>
<div class="tcrb-summary-box">
<strong><?= h((string) $summary['min_utc']) ?></strong>
<span>Erster UTC-Zeitpunkt</span>
</div>
<div class="tcrb-summary-box">
<strong><?= h((string) $summary['max_utc']) ?></strong>
<span>Letzter UTC-Zeitpunkt</span>
</div>
<div class="tcrb-summary-box">
<strong><?= number_format((float) $summary['min_mag'], 3, '.', '') ?> bis <?= number_format((float) $summary['max_mag'], 3, '.', '') ?></strong>
<span>Magnitudenbereich</span>
</div>
</div>
<div class="tcrb-chart-wrap">
<div class="tcrb-plot" id="tcrbPlot" aria-label="T-CrB-Lichtkurve"></div>
</div>
<div class="tcrb-chart-legend">
<?php foreach ($chartDatasets as $dataset): ?>
<div class="tcrb-chart-legend-item">
<span style="background: <?= h($dataset['color']) ?>"></span>
<?= h($dataset['filter']) ?>
</div>
<?php endforeach; ?>
</div>
<?php else: ?>
<div class="tcrb-chart-empty">Noch keine darstellbaren Daten vorhanden.</div>
<?php endif; ?>
</div>
</div>
<?php if (empty($errors) && !empty($observations)): ?>
<script>
(function () {
const payload = <?= json_encode($plotlyPayload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) ?>;
const plotEl = document.getElementById('tcrbPlot');
if (!plotEl || typeof Plotly === 'undefined' || !payload || !Array.isArray(payload.traces) || payload.traces.length === 0) {
return;
}
const layout = {
margin: { t: 20, r: 24, b: 56, l: 72 },
paper_bgcolor: 'rgba(0,0,0,0)',
plot_bgcolor: 'rgba(0,0,0,0)',
hovermode: 'closest',
showlegend: false,
xaxis: {
title: { text: 'Beobachtungszeitpunkt (UTC)' },
type: 'date',
gridcolor: 'rgba(255,255,255,0.08)',
linecolor: '#f8fafc',
tickfont: { color: '#cbd5e1' },
zeroline: false
},
yaxis: {
title: { text: 'Magnitude (kleiner = heller)' },
autorange: 'reversed',
gridcolor: 'rgba(255,255,255,0.12)',
linecolor: '#f8fafc',
tickfont: { color: '#cbd5e1' },
zeroline: false
},
font: {
color: '#f8fafc'
}
};
const config = {
responsive: true,
displaylogo: false,
modeBarButtonsToRemove: ['select2d', 'lasso2d']
};
Plotly.newPlot(plotEl, payload.traces, layout, config);
})();
</script>
<?php endif; ?>
<?php require __DIR__ . '/footer.php'; ?>
+7 -4
View File
@@ -9,7 +9,7 @@ declare(strict_types=1);
* Tabellen:
* - sat_satellites
* - sat_tle_current
* - sat_import_runs
* - app_import_runs
*/
ini_set('display_errors', '1');
@@ -182,13 +182,15 @@ $recordsUpdated = 0;
try {
$stmtImportStart = $pdo->prepare("
INSERT INTO sat_import_runs (
INSERT INTO app_import_runs (
source,
source_url,
started_at,
status,
message
) VALUES (
:source,
:source_url,
NOW(),
'running',
NULL
@@ -196,6 +198,7 @@ try {
");
$stmtImportStart->execute([
':source' => $sourceName,
':source_url' => $sourceUrl,
]);
$importRunId = (int)$pdo->lastInsertId();
@@ -411,7 +414,7 @@ try {
$pdo->commit();
$stmtImportFinish = $pdo->prepare("
UPDATE sat_import_runs
UPDATE app_import_runs
SET
finished_at = NOW(),
records_received = :records_received,
@@ -440,7 +443,7 @@ try {
if ($importRunId !== null) {
$stmtImportError = $pdo->prepare("
UPDATE sat_import_runs
UPDATE app_import_runs
SET
finished_at = NOW(),
records_received = :records_received,
+704
View File
@@ -0,0 +1,704 @@
<?php
declare(strict_types=1);
/**
* Importiert aktuelle T-CrB-Beobachtungen aus AAVSO WebObs in die Tabelle
* `aavso_tcrb_observations`.
*
* Nutzung:
* php scripts/import/import_tcrb.php
* php scripts/import/import_tcrb.php --pages=3
* php scripts/import/import_tcrb.php --html=C:\pfad\webobs.html --dry-run
* php scripts/import/import_tcrb.php --dir=C:\Users\ich\Desktop\TCrB
*
* Typischer Cron-Aufruf:
* php /pfad/zum/projekt/scripts/import/import_tcrb.php --pages=2
*/
error_reporting(E_ALL);
ini_set('display_errors', '1');
set_time_limit(0);
const DEFAULT_TCRB_URL = 'https://apps.aavso.org/webobs/results/?star=t+CRB&num_results=25&obs_types=ccd&page=1';
const DEFAULT_TABLE_NAME = 'aavso_tcrb_observations';
const DEFAULT_IMPORT_SOURCE = 'aavso-tcrb';
$rootDir = dirname(__DIR__, 2);
$config = require $rootDir . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'database.php';
if (!is_array($config)) {
writeMessage('config/database.php muss ein Array mit DB-Zugangsdaten zurueckgeben.', true);
exit(1);
}
$config = normalizeDbConfig($config);
foreach (['host', 'dbname', 'user', 'pass'] as $requiredKey) {
if (!array_key_exists($requiredKey, $config) || $config[$requiredKey] === '') {
writeMessage("DB-Konfiguration unvollstaendig: {$requiredKey} fehlt.", true);
exit(1);
}
}
$options = parseCliArguments($argv);
if (($options['help'] ?? false) === true) {
writeUsage();
exit(0);
}
$dsn = sprintf(
'mysql:host=%s;port=%d;dbname=%s;charset=%s',
$config['host'],
(int) $config['port'],
$config['dbname'],
$config['charset']
);
$pdo = new PDO(
$dsn,
$config['user'],
$config['pass'],
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]
);
$tableName = DEFAULT_TABLE_NAME;
if (!tableExists($pdo, $tableName)) {
writeMessage("Die Zieltabelle `{$tableName}` existiert noch nicht. Wir koennen sie im naechsten Schritt gemeinsam anlegen.", true);
exit(1);
}
ensureImportRunsTableExists($pdo);
$insertSql = <<<SQL
INSERT INTO `{$tableName}` (
`source_row_key`,
`star_name`,
`jd`,
`observed_at_utc`,
`calendar_date_text`,
`magnitude`,
`magnitude_error`,
`filter_code`,
`observer_code`,
`notes_raw`,
`imported_at`
) VALUES (
:source_row_key,
:star_name,
:jd,
:observed_at_utc,
:calendar_date_text,
:magnitude,
:magnitude_error,
:filter_code,
:observer_code,
:notes_raw,
NOW()
)
ON DUPLICATE KEY UPDATE
`star_name` = VALUES(`star_name`),
`observed_at_utc` = VALUES(`observed_at_utc`),
`calendar_date_text` = VALUES(`calendar_date_text`),
`magnitude` = VALUES(`magnitude`),
`magnitude_error` = VALUES(`magnitude_error`),
`filter_code` = VALUES(`filter_code`),
`observer_code` = VALUES(`observer_code`),
`notes_raw` = VALUES(`notes_raw`),
`imported_at` = NOW(),
`updated_at` = NOW()
SQL;
$statement = $pdo->prepare($insertSql);
$pagesToImport = max(1, (int) ($options['pages'] ?? 1));
$sourceHtmlPath = $options['html'] ?? null;
$sourceDirectoryPath = $options['dir'] ?? null;
$dryRun = (bool) ($options['dry-run'] ?? false);
$baseUrl = (string) ($options['url'] ?? DEFAULT_TCRB_URL);
$totalImported = 0;
$totalUpserts = 0;
$recordsInserted = 0;
$recordsUpdated = 0;
$importRunId = null;
if ($sourceHtmlPath !== null && $sourceDirectoryPath !== null) {
writeMessage('Bitte entweder --html oder --dir verwenden, nicht beides gleichzeitig.', true);
exit(1);
}
$importSources = [];
if ($sourceDirectoryPath !== null) {
foreach (findHtmlFilesInDirectory($sourceDirectoryPath) as $filePath) {
$importSources[] = [
'label' => basename($filePath),
'html' => loadHtmlFromFile($filePath),
'is_local_file' => true,
];
}
if (empty($importSources)) {
writeMessage("Im Ordner wurden keine importierbaren HTML/TXT-Dateien gefunden: {$sourceDirectoryPath}", true);
exit(1);
}
} elseif ($sourceHtmlPath !== null) {
$importSources[] = [
'label' => basename($sourceHtmlPath),
'html' => loadHtmlFromFile($sourceHtmlPath),
'is_local_file' => true,
];
} else {
for ($pageNumber = 1; $pageNumber <= $pagesToImport; $pageNumber++) {
$importSources[] = [
'label' => 'Seite ' . $pageNumber,
'html' => downloadUrl(buildPagedUrl($baseUrl, $pageNumber)),
'is_local_file' => false,
];
}
}
if (!$dryRun) {
$stmtImportStart = $pdo->prepare("
INSERT INTO app_import_runs (
source,
source_url,
started_at,
status,
message
) VALUES (
:source,
:source_url,
NOW(),
'running',
NULL
)
");
$stmtImportStart->execute([
':source' => DEFAULT_IMPORT_SOURCE,
':source_url' => $sourceDirectoryPath !== null ? $sourceDirectoryPath : ($sourceHtmlPath !== null ? $sourceHtmlPath : $baseUrl),
]);
$importRunId = (int) $pdo->lastInsertId();
}
foreach ($importSources as $sourceIndex => $source) {
$pageNumber = $sourceIndex + 1;
$html = (string) $source['html'];
$pageData = parseWebObsPage($html);
if (empty($pageData['observations'])) {
writeMessage(($source['label'] ?? ('Seite ' . $pageNumber)) . ': keine Beobachtungen gefunden.');
if (($source['is_local_file'] ?? false) === true) {
continue;
}
continue;
}
writeMessage(sprintf(
'%s: %d Beobachtungen fuer %s gefunden.',
(string) ($source['label'] ?? ('Seite ' . $pageNumber)),
count($pageData['observations']),
$pageData['target_name'] !== '' ? $pageData['target_name'] : 'T CrB'
));
if ($dryRun) {
$totalImported += count($pageData['observations']);
continue;
}
$pdo->beginTransaction();
try {
foreach ($pageData['observations'] as $observation) {
$statement->execute([
':source_row_key' => $observation['source_row_key'],
':star_name' => $observation['star_name'],
':jd' => $observation['jd'],
':observed_at_utc' => $observation['observed_at_utc'],
':calendar_date_text' => $observation['calendar_date_text'],
':magnitude' => $observation['magnitude'],
':magnitude_error' => $observation['magnitude_error'],
':filter_code' => $observation['filter_code'],
':observer_code' => $observation['observer_code'],
':notes_raw' => $observation['notes_raw'],
]);
$affectedRows = (int) $statement->rowCount();
$totalUpserts += $affectedRows;
if ($affectedRows === 1) {
$recordsInserted++;
} elseif ($affectedRows >= 2) {
$recordsUpdated++;
}
$totalImported++;
}
$pdo->commit();
} catch (Throwable $e) {
if ($pdo->inTransaction()) {
$pdo->rollBack();
}
if ($importRunId !== null) {
$stmtImportError = $pdo->prepare("
UPDATE app_import_runs
SET
finished_at = NOW(),
records_received = :records_received,
records_inserted = :records_inserted,
records_updated = :records_updated,
status = 'error',
message = :message
WHERE id = :id
");
$stmtImportError->execute([
':records_received' => $totalImported,
':records_inserted' => $recordsInserted,
':records_updated' => $recordsUpdated,
':message' => substr($e->getMessage(), 0, 65000),
':id' => $importRunId,
]);
}
writeMessage('Import fehlgeschlagen bei ' . (string) ($source['label'] ?? ('Seite ' . $pageNumber)) . ': ' . $e->getMessage(), true);
exit(1);
}
}
if ($dryRun) {
writeMessage("Dry-Run abgeschlossen. Parsbare Beobachtungen: {$totalImported}.");
exit(0);
}
if ($importRunId !== null) {
$stmtImportFinish = $pdo->prepare("
UPDATE app_import_runs
SET
finished_at = NOW(),
records_received = :records_received,
records_inserted = :records_inserted,
records_updated = :records_updated,
status = 'success',
message = NULL
WHERE id = :id
");
$stmtImportFinish->execute([
':records_received' => $totalImported,
':records_inserted' => $recordsInserted,
':records_updated' => $recordsUpdated,
':id' => $importRunId,
]);
}
writeMessage("Import abgeschlossen. Verarbeitete Beobachtungen: {$totalImported}. DB-Upserts: {$totalUpserts}.");
exit(0);
function parseCliArguments(array $argv): array
{
$options = [
'pages' => 1,
'dry-run' => false,
'help' => false,
];
foreach (array_slice($argv, 1) as $argument) {
if ($argument === '--dry-run') {
$options['dry-run'] = true;
continue;
}
if ($argument === '--help' || $argument === '-h') {
$options['help'] = true;
continue;
}
if (str_starts_with($argument, '--pages=')) {
$options['pages'] = (int) substr($argument, 8);
continue;
}
if (str_starts_with($argument, '--url=')) {
$options['url'] = (string) substr($argument, 6);
continue;
}
if (str_starts_with($argument, '--html=')) {
$options['html'] = (string) substr($argument, 7);
continue;
}
if (str_starts_with($argument, '--dir=')) {
$options['dir'] = (string) substr($argument, 6);
continue;
}
}
return $options;
}
function writeUsage(): void
{
$usageLines = [
'Nutzung:',
' php scripts/import/import_tcrb.php',
' php scripts/import/import_tcrb.php --pages=3',
' php scripts/import/import_tcrb.php --html=C:\pfad\webobs.html --dry-run',
' php scripts/import/import_tcrb.php --dir=C:\Users\ich\Desktop\TCrB',
'',
'Optionen:',
' --pages=N Anzahl der zu ladenden Ergebnisseiten, Standard: 1',
' --url=URL Basis-URL fuer den Abruf, Standard: AAVSO T CrB CCD',
' --html=PFAD Liest die erste Seite aus einer lokalen HTML-Datei statt aus dem Web',
' --dir=PFAD Liest alle HTML/TXT-Dateien aus einem Ordner in Dateinamen-Reihenfolge ein',
' --dry-run Parst nur und schreibt nichts in die DB',
' --help Diese Hilfe anzeigen',
];
foreach ($usageLines as $line) {
writeMessage($line);
}
}
function normalizeDbConfig(array $config): array
{
$config['port'] = isset($config['port']) && (int) $config['port'] > 0 ? (int) $config['port'] : 3306;
$config['charset'] = isset($config['charset']) && $config['charset'] !== '' ? (string) $config['charset'] : 'utf8mb4';
return $config;
}
function tableExists(PDO $pdo, string $tableName): bool
{
$stmt = $pdo->prepare('
SELECT COUNT(*)
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = :table_name
');
$stmt->execute([':table_name' => $tableName]);
return (int) $stmt->fetchColumn() > 0;
}
function ensureImportRunsTableExists(PDO $pdo): void
{
$pdo->exec("
CREATE TABLE IF NOT EXISTS `app_import_runs` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`source` varchar(32) NOT NULL,
`source_url` varchar(500) DEFAULT NULL,
`started_at` datetime NOT NULL,
`finished_at` datetime DEFAULT NULL,
`records_received` int(11) NOT NULL DEFAULT 0,
`records_inserted` int(11) NOT NULL DEFAULT 0,
`records_updated` int(11) NOT NULL DEFAULT 0,
`status` varchar(32) NOT NULL,
`message` text DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_app_import_runs_source` (`source`),
KEY `idx_app_import_runs_started_at` (`started_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
");
}
function loadHtmlFromFile(string $path): string
{
if (!is_file($path)) {
throw new RuntimeException("HTML-Datei nicht gefunden: {$path}");
}
$html = file_get_contents($path);
if ($html === false || trim($html) === '') {
throw new RuntimeException("HTML-Datei konnte nicht gelesen werden: {$path}");
}
return $html;
}
function findHtmlFilesInDirectory(string $directoryPath): array
{
if (!is_dir($directoryPath)) {
throw new RuntimeException("Ordner nicht gefunden: {$directoryPath}");
}
$entries = scandir($directoryPath);
if ($entries === false) {
throw new RuntimeException("Ordner konnte nicht gelesen werden: {$directoryPath}");
}
$filePaths = [];
foreach ($entries as $entry) {
if ($entry === '.' || $entry === '..') {
continue;
}
$fullPath = rtrim($directoryPath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $entry;
if (!is_file($fullPath)) {
continue;
}
$extension = strtolower((string) pathinfo($fullPath, PATHINFO_EXTENSION));
if (!in_array($extension, ['html', 'htm', 'txt'], true)) {
continue;
}
$filePaths[] = $fullPath;
}
natsort($filePaths);
return array_values($filePaths);
}
function buildPagedUrl(string $baseUrl, int $pageNumber): string
{
$parts = parse_url($baseUrl);
if ($parts === false) {
throw new RuntimeException('Ungueltige URL: ' . $baseUrl);
}
$query = [];
parse_str((string) ($parts['query'] ?? ''), $query);
$query['page'] = $pageNumber;
$scheme = $parts['scheme'] ?? 'https';
$host = $parts['host'] ?? '';
$path = $parts['path'] ?? '';
$queryString = http_build_query($query);
return $scheme . '://' . $host . $path . ($queryString !== '' ? '?' . $queryString : '');
}
function downloadUrl(string $url): string
{
if (DIRECTORY_SEPARATOR === '\\' && function_exists('shell_exec')) {
$urlBase64 = base64_encode($url);
$powerShellScript = str_replace(
'__URL_BASE64__',
$urlBase64,
<<<'PS'
$ErrorActionPreference = 'Stop'
$ProgressPreference = 'SilentlyContinue'
$url = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String('__URL_BASE64__'))
$response = Invoke-WebRequest -Uri $url -UseBasicParsing -Headers @{ 'User-Agent' = 'SkyView-TCrB-Importer/1.0' }
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$response.Content
PS
);
$encodedCommandBinary = function_exists('iconv')
? iconv('UTF-8', 'UTF-16LE', $powerShellScript)
: $powerShellScript;
$encodedCommand = base64_encode($encodedCommandBinary === false ? $powerShellScript : $encodedCommandBinary);
$command = 'powershell -NoProfile -ExecutionPolicy Bypass -EncodedCommand ' . $encodedCommand;
$output = shell_exec($command);
if ($output !== null && trim($output) !== '') {
return $output;
}
}
if (function_exists('curl_init')) {
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CONNECTTIMEOUT => 15,
CURLOPT_TIMEOUT => 60,
CURLOPT_USERAGENT => 'SkyView-TCrB-Importer/1.0',
]);
$response = curl_exec($ch);
if ($response === false) {
$error = curl_error($ch);
curl_close($ch);
throw new RuntimeException('Download fehlgeschlagen: ' . $error);
}
$httpCode = (int) curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($httpCode < 200 || $httpCode >= 300) {
throw new RuntimeException("Download fehlgeschlagen. HTTP-Status: {$httpCode}");
}
return (string) $response;
}
$context = stream_context_create([
'http' => [
'method' => 'GET',
'header' => implode("\r\n", [
'User-Agent: SkyView-TCrB-Importer/1.0',
]),
'timeout' => 60,
'ignore_errors' => true,
],
]);
$response = @file_get_contents($url, false, $context);
if ($response === false) {
throw new RuntimeException('Download fehlgeschlagen: keine Antwort erhalten.');
}
return $response;
}
function parseWebObsPage(string $html): array
{
libxml_use_internal_errors(true);
$dom = new DOMDocument();
$loaded = $dom->loadHTML($html);
libxml_clear_errors();
if ($loaded === false) {
throw new RuntimeException('HTML konnte nicht geparst werden.');
}
$xpath = new DOMXPath($dom);
$targetName = '';
$obsInfoNode = $xpath->query("//p[@id='obsinfo']")->item(0);
if ($obsInfoNode instanceof DOMNode) {
$obsInfoText = normalizeWhitespace($obsInfoNode->textContent);
if (preg_match('/for\s+(.+?)\s+from\s+/i', $obsInfoText, $matches) === 1) {
$targetName = trim($matches[1]);
}
}
$observations = [];
$rowNodes = $xpath->query("//table[contains(@class,'observations')]/tbody/tr[contains(@class,'obs')]");
if ($rowNodes === false) {
return [
'target_name' => $targetName,
'observations' => [],
];
}
foreach ($rowNodes as $rowNode) {
if (!$rowNode instanceof DOMElement) {
continue;
}
$rowId = trim((string) $rowNode->getAttribute('id'));
$tdNodes = $xpath->query('./td', $rowNode);
if ($tdNodes === false || $tdNodes->length < 8) {
continue;
}
$starName = normalizeWhitespace($tdNodes->item(1)?->textContent ?? '');
$jdText = normalizeWhitespace($tdNodes->item(2)?->textContent ?? '');
$calendarDateText = normalizeWhitespace($tdNodes->item(3)?->textContent ?? '');
$magnitudeText = normalizeWhitespace($tdNodes->item(4)?->textContent ?? '');
$magnitudeErrorText = normalizeWhitespace($tdNodes->item(5)?->textContent ?? '');
$filterCode = normalizeWhitespace($tdNodes->item(6)?->textContent ?? '');
$observerCode = normalizeWhitespace($tdNodes->item(7)?->textContent ?? '');
if ($jdText === '' || $magnitudeText === '') {
continue;
}
$detailRow = $xpath->query("//tr[@id='{$rowId}-detail']")->item(0);
$notesRaw = null;
if ($detailRow instanceof DOMElement) {
$detailCells = $xpath->query(".//table[contains(@class,'obs-detail')]/tbody/tr/td", $detailRow);
if ($detailCells !== false && $detailCells->length >= 6) {
$notesRaw = normalizeWhitespace($detailCells->item(5)?->textContent ?? '');
$notesRaw = $notesRaw !== '' && $notesRaw !== '—' ? $notesRaw : null;
}
}
$jd = (float) str_replace(',', '.', $jdText);
$observedAtUtc = jdToUtcString($jd);
$observations[] = [
'source_row_key' => $rowId !== '' ? $rowId : null,
'star_name' => $starName !== '' ? $starName : ($targetName !== '' ? $targetName : 'T CrB'),
'jd' => number_format($jd, 6, '.', ''),
'observed_at_utc' => $observedAtUtc,
'calendar_date_text' => $calendarDateText !== '' ? $calendarDateText : null,
'magnitude' => normalizeNumeric($magnitudeText),
'magnitude_error' => $magnitudeErrorText !== '' ? normalizeNumeric($magnitudeErrorText) : null,
'filter_code' => $filterCode !== '' ? $filterCode : null,
'observer_code' => $observerCode !== '' ? $observerCode : null,
'notes_raw' => $notesRaw,
];
}
return [
'target_name' => $targetName,
'observations' => $observations,
];
}
function normalizeWhitespace(string $value): string
{
$value = html_entity_decode($value, ENT_QUOTES | ENT_HTML5, 'UTF-8');
$value = preg_replace('/\s+/u', ' ', trim($value));
return $value ?? '';
}
function normalizeNumeric(string $value): string
{
return str_replace(',', '.', trim($value));
}
function jdToUtcString(float $jd): string
{
$jd += 0.5;
$z = (int) floor($jd);
$f = $jd - $z;
if ($z >= 2299161) {
$alpha = (int) floor(($z - 1867216.25) / 36524.25);
$a = $z + 1 + $alpha - (int) floor($alpha / 4);
} else {
$a = $z;
}
$b = $a + 1524;
$c = (int) floor(($b - 122.1) / 365.25);
$d = (int) floor(365.25 * $c);
$e = (int) floor(($b - $d) / 30.6001);
$day = $b - $d - (int) floor(30.6001 * $e) + $f;
$month = $e < 14 ? $e - 1 : $e - 13;
$year = $month > 2 ? $c - 4716 : $c - 4715;
$dayInteger = (int) floor($day);
$dayFraction = $day - $dayInteger;
$totalSeconds = (int) round($dayFraction * 86400);
if ($totalSeconds >= 86400) {
$totalSeconds = 86399;
}
$hours = intdiv($totalSeconds, 3600);
$minutes = intdiv($totalSeconds % 3600, 60);
$seconds = $totalSeconds % 60;
return sprintf(
'%04d-%02d-%02d %02d:%02d:%02d',
$year,
$month,
$dayInteger,
$hours,
$minutes,
$seconds
);
}
function writeMessage(string $message, bool $isError = false): void
{
$prefix = '[' . date('Y-m-d H:i:s') . '] ';
$stream = $isError ? STDERR : STDOUT;
fwrite($stream, $prefix . $message . PHP_EOL);
}