车东 Che, Dong

Wed 15 July, 2026

05:03 docs: add batch-enhance.php CLI reference with --status to §2.12.1 » Recent Commits to phpman:master
docs: add batch-enhance.php CLI reference with --status to §2.12.1

Documents all options including --status, --stop, --restart,
--rebuild, --parameter, --format, --cached-first, --cache-only,
--rate-limit, --pid-file. Includes quick enhance shorthand,
full batch mode, and process management examples.

Co-Authored-By: Claude <noreply@taotoken.net>

Tue 14 July, 2026

00:24 docs: extract LLM enhancement + GA analytics to external projects » Recent Commits to phpman:master
docs: extract LLM enhancement + GA analytics to external projects

Following the 2026-07-14 architectural simplification, phpMan is now a
pure documentation server: man/perldoc/info/pydoc/ri → raw HTML/Markdown/
JSON/MCP, 0 LLM calls. Two capabilities move out to standalone repos.

docs/01-PRODUCT.md §2.12:
  Old "LLM Emoji Enhancement (v4.0)" (148 lines) replaced with a short
  "Moved to External Project" note listing what moved and why.

docs/05-PLAN.md:
  v4.10 entry replaced with "Superseded by External site-stats Project".
  v4.0 Phase 3 marked as shipped-then-moved-out.
  New "## Migration Plan: phpMan → llm_enhance + site_stats" section
  with 7 phases (A–G), source/transformation/sink abstractions, code
  migration map, 5-week schedule, rollback plan, 6 open questions.

docs/06-ANALYTICS.md:
  Rewritten as a STANDALONE multi-site service design (not a phpMan MCP
  tool). Pluggable DataSource (GA4 → Plausible later), 7 report
  categories, MCP + HTTP/JSON dual interface, phpMan is one consumer.

docs/00-INDEX.md:
  Reorganized to separate "External Projects (References)" from phpMan
  docs. Added "What phpMan Does NOT Do" table.

Companion issues opened: #222 (llm_enhance), #223 (site_stats),
#224 (phpMan v5.0 cleanup). Closed #216 (PATH_INFO guard bug, already
fixed by validatePathInfo() in earlier commit.

Co-Authored-By: AtomCode (minimax-m3) <noreply@atomgit.com>
EOF
)

Mon 13 July, 2026

21:13 fix: deploy src/ before phpMan.php to avoid transient 500 errors » Recent Commits to phpman:master
fix: deploy src/ before phpMan.php to avoid transient 500 errors

On 2026-07-13, deploying v4.9.26 to production caused 2 transient
HTTP 500 errors (Applebot requests at 20:19:46 and 20:19:48 PDT):

  PHP Fatal error:  Uncaught Error: Call to undefined function
  validatePathInfo() in /home/chedong/chedong.com/phpMan.php:106

Root cause: the Makefile deploy order uploaded phpMan.php (which calls
validatePathInfo) BEFORE src/util.php (which defines it). During the
~30 second window between the two rsync/scp operations, any request
to a Perl module URL hit the new phpMan.php with the old src/, returning
500 instead of 200/403.

Fix: swap the order in both _deploy-code (staging) and _release-code
(production) so src/ is uploaded first, then phpMan.php. Same
rsync/scp commands, just reordered.

The first v4.9.x release with a src/ function addition since the
multi-file split revealed this latent ordering bug. Before this, src/
files were unchanged on most deploys so the window never had a
mismatched function definition.

After fix: post-deploy window 7-13 20:19-20:42 (25 min) shows
- 676 successful phpMan.php responses (200/301/302)
- 2 expected 403s (sftp://, sftp:onedrive:gdocs: — correctly rejected)
- 0 new 500s after 20:19:50

Co-Authored-By: AtomCode (minimax-m3) <noreply@atomgit.com>
19:47 Merge SourceForge upstream (AdSense) + Perl module fix » Recent Commits to phpman:master
Merge SourceForge upstream (AdSense) + Perl module fix
19:42 fix: prevent PHP default_socket_timeout from preempting CURLOPT_TIMEOUT » Recent Commits to phpman:master
fix: prevent PHP default_socket_timeout from preempting CURLOPT_TIMEOUT

Add ini_set('default_socket_timeout', max(timeout+30, 900)) before
each LLM API call so the 600s primary / 300s fallback cURL timeouts
actually take effect. Previously default_socket_timeout=60s was
silently cutting off long-running requests.

Co-Authored-By: Claude <noreply@taotoken.net>
19:42 fix: allow valid Perl modules with multiple :: in 403 guard » Recent Commits to phpman:master
fix: allow valid Perl modules with multiple :: in 403 guard

The PATH_INFO 403 guard was rejecting any path segment with > 2 colons,
which wrongly blocked valid Perl module URLs like
/man/Dpkg::Control::HashCore (4 colons, two :: pairs) and
/perldoc/A::B::C::D::E (8 colons).

Replace the count-based check with a single-colon detector: only colons
that are NOT part of a '::' pair are treated as URI-scheme indicators.
This preserves the original protection against scanner probes
(sftp:onedrive:gdocs:) while allowing any depth of Perl package name.

- Extract the guard into testable validatePathInfo() in src/util.php
- Returns the failing condition name (tooLong/tooDeep/hasProto/
  hasProtocolColon) instead of just true/false
- Add test/unit/test_path_guard.php with 26 assertions covering:
  - Valid Perl modules at 1/2/3/4/5 :: pairs
  - C++ namespaces (std::string)
  - Rejection of sftp://, http://, sftp:onedrive:, Foo::Bar:Baz
  - Boundary cases for tooLong (100 chars) and tooDeep (5/6 segments)
- All 349 unit+integration tests pass
19:42 Restore PATH_INFO guard (ec489ee, lost in code split) + colons enhanc… » Recent Commits to phpman:master
Restore PATH_INFO guard (ec489ee, lost in code split) + colons enhancement

Original guard (2024-06-24) rejected >100 chars, >5 segments, :/ pattern.
Lost during 4,500→753 line src/ split. Restored with 403 Forbidden.

Added: segment with >2 colons check.
Verified: 7/5 log had 1,148 protocol-prefix requests, 52 returned 200.

Co-Authored-By: Claude <noreply@taotoken.net>
19:42 Increase LLM timeout: primary 120→600s, fallback default 60→300s » Recent Commits to phpman:master
Increase LLM timeout: primary 120→600s, fallback default 60→300s
19:42 Add runtime process status to --status output » Recent Commits to phpman:master
Add runtime process status to --status output

Per-mode table shows:
- Running/stopped status with uptime (✅ ⚠️ ⏸️)
- PID and process age
- Error count since process start
- Last enhanced timestamp + stall detection (>5min idle = ⚠️)

Reads PID files at known locations per mode, checks posix_kill
for liveness, queries error log for per-mode error counts.

Co-Authored-By: Claude <noreply@taotoken.net>
19:42 Add log-analyze.sh — web access log analysis tool » Recent Commits to phpman:master
Add log-analyze.sh — web access log analysis tool

Supports date range, spider breakdown, page type stats, status codes,
hourly distribution. Auto-discovers rotated logs by date.

Usage: bash cli/log-analyze.sh [YYYY-MM-DD] [YYYY-MM-DD]

Co-Authored-By: Claude <noreply@taotoken.net>
19:42 Add URL attack guard: reject malformed paths with protocol-prefix traps » Recent Commits to phpman:master
19:42 Add LLM gateway failure analysis report » Recent Commits to phpman:master
19:42 Add /status JSON endpoint for batch enhance process monitoring » Recent Commits to phpman:master
19:42 Add --restart option to batch-enhance.php » Recent Commits to phpman:master
19:41 fix: allow valid Perl modules with multiple :: in 403 guard » Recent Commits to phpman:master
10:13 Add /status JSON endpoint for batch enhance process monitoring » Recent Commits to phpman:master
08:40 fix: prevent PHP default_socket_timeout from preempting CURLOPT_TIMEOUT » Recent Commits to phpman:master
05:02 Increase LLM timeout: primary 120→600s, fallback default 60→300s » Recent Commits to phpman:master

Thu 09 July, 2026

08:54 Add LLM gateway failure analysis report » Recent Commits to phpman:master

Tue 07 July, 2026

23:09 Add runtime process status to --status output » Recent Commits to phpman:master