This repository was archived by the owner on Jun 7, 2021. It is now read-only.

Repository files navigation

Full Stop

I still like the idea but there is currently no use case to develop it anymore.

Apache Server Status Parser Component for PHP

This project aims to deliver an easy to use component to read the apache server status for a configured list of hosts and gain information about that.

This component is relying on the apache mod_status and the undocumented query "?notable" ("?auto" does not contain information about the pid).

The build status of the current master branch is tracked by Travis CI: Build StatusLatest stable

The scrutinizer status is: code quality

Take a look on openhub.net.

The current change log can be found here.

Project Goals

  • provides simple access to process information (deals with strings)
  • provides detailed access to all information (building a lot of objects)

Why?

Let me give you an scenario I got on my desk and had to solve it.

Given

As a maintainer of an infrastructure with multiple apache HTTP servers, I need to know if a given process (identified by its pid, a infrastructure wide unique identifier and its uri) is still running or not. Sometimes I know the IP Address of the server where process is running, mostly all I have is a pid, the unique identifier and the uri. And finally, it is allowed to use the apache server status but no ssh command execution.

How To Use

Because of the shipped with builders, it is really easy to getting started with. If you want to use your application instance pooling, use the builders as manual how to plumper things together.

There are two different kind of builders, one (AbstractStorageBuilder) gives you the control over where to fetch and how much to fetch information. The second one (ParserBuilder) simple uses the result from the first one to parse the information into domain objects.

//If you want to parse the whole apache server status// and create domain objects out of the information.//begin of dependencies$parserBuilderFactory = new \Net\Bazzline\Component\ApacheServerStatusParser\Service\Builder\ParserBuilderFactory();
$storageBuilder = new \Net\Bazzline\Component\ApacheServerStatusParser\Service\Builder\RemoteStorageBuilder();
$parserBuilder = $parserBuilderFactory->create();
//end of dependencies//begin of business logic// the following five logical lines are doing the trick$storageBuilder->setUrlToTheApacheStatusFileToParseUpfront('<the url to your apache server status>');
$storageBuilder->selectParseModeAllUpfront();
$storageBuilder->build();
$parserBuilder->setStorageUpfront(
$storageBuilder->andGetStorageAfterTheBuild();
);
$parserBuilder->build();
// and now, do something with the resultvar_dump(
$parserBuilder->andGetListOfDetailOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetInformationOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetScoreboardOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetStatisticOrNullAfterwards()
);
//end of business logic

Example

Examples are placed in the path /example. Because of the two implemented content fetchers, they are devide into the two categories "local" and "remote".

Example Using Local File

cd <project root>/example/local
#if no file path is provided, the shipped with example file will be used
#parse all
php parse_all.php [<string: path to the apache status file to parse>]
#parse detail only
php parse_detail_only.php [<string: path to the apache status file to parse>]
#check if a request is still running
php check_if_a_request_is_still_running <int: pid> [<string: uri path> [<string: path to the example file>]]

Example Using Remote File

cd <project root>/example/remote
#if no file path is provided, the build in example url will be used
#parse all
php remote/parse_all.php [<string: url to the apache status page>]
#parse detail only
php parse_detail_only.php [<string: url to the apache status page>]

Example Output

Parsed Detail

Just one detail.

http_method: GET
ip_address: 198.76.54.42
pid: 22754
status: Ready
uri_authority: example.host.org:80
uri_path_with_query: /

Parsed Information

date_of_built: Oct 06 1983 20:44:43
identifier: first.example.host.org (via 123.45.67.89)
mode_of_mpm: prefork
version: Apache/2.4.10 (Debian)

Parsed Scoreboard

process: _WWW_WWWWKW_....._.W..................................................................................................................................
legend
0: "_" Waiting for Connection,
1: "S" Starting up,
2: "R" Reading Request,
3: "W" Sending Reply,
4: "K" Keepalive (read),
5: "D" DNS Lookup,
6: "C" Closing connection,
7: "L" Logging,
8: "G" Gracefully finishing,
9: "I" Idle cleanup of worker,
10: "." Open slot with no current process

Parsed Statistic

b_per_request: 1667
cpu_load: 584
cpu_usage: u959.08 s127.38 cu1.72 cs.95
current_timestamp: 1485804167
idle_workers: 4
kb_per_request: 57
parent_server_configuration_generation: 1
parent_server_mpm_generation: 1
requests_currently_being_processed: 10
requests_per_second: 283
restart_timestamp: 1485785532
server_load: 1.22 1.05 0.83
server_up_time: 5 hours 10 minutes 35 seconds
total_accesses: 5279
total_traffic: 29.6 MB

Install

By Hand

mkdir -p vendor/net_bazzline/php_component_apache_server_status_parser
cd vendor/net_bazzline/php_component_apache_server_status_parser
git clone https://github.com/bazzline/php_component_apache_server_status_parser .
composer require net_bazzline/php_component_apache_server_status_parser:dev-master

Workflow

  • get content
  • split content into dedicated sections
    • detail
    • information
    • scoreboard
    • statistic
  • parse each section into its fitting domain object

List Of Domain Model

  • DomainModel\Detail
    • dynamic detail information about each worker
  • DomainModel\Information
    • general static information about the environment
  • DomainModel\Scoreboard
    • dynamic and general worker information
  • DomainModel\Statistic
    • dynamic server statistic

List Of Service

  • Service\Builder
    • contains builder classes to kickstart the usage of this component
  • Service\Content\Fetcher
    • contains classes to get the apache status content from somewhere
  • Service\Content\Parser
    • contains classes to create domain objects out of the content
  • Service\Content\Processor
    • contains the class to split the content into logical parts (does the heavy lifting)
  • Service\Content\Storage
    • contains classes to share the logical content parts
  • Service\StateMachine
    • contains a class to ease up splitting the content into logical parts

Notes

Thanks to:

Final Words

Star it if you like it :-). Add issues if you need it. Pull patches if you enjoy it. Write a blog entry if you use it. Donate something if you love it :-].

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Jun 7, 2021. It is now read-only.

Repository files navigation

Full Stop

I still like the idea but there is currently no use case to develop it anymore.

Apache Server Status Parser Component for PHP

This project aims to deliver an easy to use component to read the apache server status for a configured list of hosts and gain information about that.

This component is relying on the apache mod_status and the undocumented query "?notable" ("?auto" does not contain information about the pid).

The build status of the current master branch is tracked by Travis CI: Build StatusLatest stable

The scrutinizer status is: code quality

Take a look on openhub.net.

The current change log can be found here.

Project Goals

  • provides simple access to process information (deals with strings)
  • provides detailed access to all information (building a lot of objects)

Why?

Let me give you an scenario I got on my desk and had to solve it.

Given

As a maintainer of an infrastructure with multiple apache HTTP servers, I need to know if a given process (identified by its pid, a infrastructure wide unique identifier and its uri) is still running or not. Sometimes I know the IP Address of the server where process is running, mostly all I have is a pid, the unique identifier and the uri. And finally, it is allowed to use the apache server status but no ssh command execution.

How To Use

Because of the shipped with builders, it is really easy to getting started with. If you want to use your application instance pooling, use the builders as manual how to plumper things together.

There are two different kind of builders, one (AbstractStorageBuilder) gives you the control over where to fetch and how much to fetch information. The second one (ParserBuilder) simple uses the result from the first one to parse the information into domain objects.

//If you want to parse the whole apache server status// and create domain objects out of the information.//begin of dependencies$parserBuilderFactory = new \Net\Bazzline\Component\ApacheServerStatusParser\Service\Builder\ParserBuilderFactory();
$storageBuilder = new \Net\Bazzline\Component\ApacheServerStatusParser\Service\Builder\RemoteStorageBuilder();
$parserBuilder = $parserBuilderFactory->create();
//end of dependencies//begin of business logic// the following five logical lines are doing the trick$storageBuilder->setUrlToTheApacheStatusFileToParseUpfront('<the url to your apache server status>');
$storageBuilder->selectParseModeAllUpfront();
$storageBuilder->build();
$parserBuilder->setStorageUpfront(
$storageBuilder->andGetStorageAfterTheBuild();
);
$parserBuilder->build();
// and now, do something with the resultvar_dump(
$parserBuilder->andGetListOfDetailOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetInformationOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetScoreboardOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetStatisticOrNullAfterwards()
);
//end of business logic

Example

Examples are placed in the path /example. Because of the two implemented content fetchers, they are devide into the two categories "local" and "remote".

Example Using Local File

cd <project root>/example/local
#if no file path is provided, the shipped with example file will be used
#parse all
php parse_all.php [<string: path to the apache status file to parse>]
#parse detail only
php parse_detail_only.php [<string: path to the apache status file to parse>]
#check if a request is still running
php check_if_a_request_is_still_running <int: pid> [<string: uri path> [<string: path to the example file>]]

Example Using Remote File

cd <project root>/example/remote
#if no file path is provided, the build in example url will be used
#parse all
php remote/parse_all.php [<string: url to the apache status page>]
#parse detail only
php parse_detail_only.php [<string: url to the apache status page>]

Example Output

Parsed Detail

Just one detail.

http_method: GET
ip_address: 198.76.54.42
pid: 22754
status: Ready
uri_authority: example.host.org:80
uri_path_with_query: /

Parsed Information

date_of_built: Oct 06 1983 20:44:43
identifier: first.example.host.org (via 123.45.67.89)
mode_of_mpm: prefork
version: Apache/2.4.10 (Debian)

Parsed Scoreboard

process: _WWW_WWWWKW_....._.W..................................................................................................................................
legend
0: "_" Waiting for Connection,
1: "S" Starting up,
2: "R" Reading Request,
3: "W" Sending Reply,
4: "K" Keepalive (read),
5: "D" DNS Lookup,
6: "C" Closing connection,
7: "L" Logging,
8: "G" Gracefully finishing,
9: "I" Idle cleanup of worker,
10: "." Open slot with no current process

Parsed Statistic

b_per_request: 1667
cpu_load: 584
cpu_usage: u959.08 s127.38 cu1.72 cs.95
current_timestamp: 1485804167
idle_workers: 4
kb_per_request: 57
parent_server_configuration_generation: 1
parent_server_mpm_generation: 1
requests_currently_being_processed: 10
requests_per_second: 283
restart_timestamp: 1485785532
server_load: 1.22 1.05 0.83
server_up_time: 5 hours 10 minutes 35 seconds
total_accesses: 5279
total_traffic: 29.6 MB

Install

By Hand

mkdir -p vendor/net_bazzline/php_component_apache_server_status_parser
cd vendor/net_bazzline/php_component_apache_server_status_parser
git clone https://github.com/bazzline/php_component_apache_server_status_parser .
composer require net_bazzline/php_component_apache_server_status_parser:dev-master

Workflow

  • get content
  • split content into dedicated sections
    • detail
    • information
    • scoreboard
    • statistic
  • parse each section into its fitting domain object

List Of Domain Model

  • DomainModel\Detail
    • dynamic detail information about each worker
  • DomainModel\Information
    • general static information about the environment
  • DomainModel\Scoreboard
    • dynamic and general worker information
  • DomainModel\Statistic
    • dynamic server statistic

List Of Service

  • Service\Builder
    • contains builder classes to kickstart the usage of this component
  • Service\Content\Fetcher
    • contains classes to get the apache status content from somewhere
  • Service\Content\Parser
    • contains classes to create domain objects out of the content
  • Service\Content\Processor
    • contains the class to split the content into logical parts (does the heavy lifting)
  • Service\Content\Storage
    • contains classes to share the logical content parts
  • Service\StateMachine
    • contains a class to ease up splitting the content into logical parts

Notes

Thanks to:

Final Words

Star it if you like it :-). Add issues if you need it. Pull patches if you enjoy it. Write a blog entry if you use it. Donate something if you love it :-].

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jun 7, 2021. It is now read-only.

Repository files navigation

Full Stop

I still like the idea but there is currently no use case to develop it anymore.

Apache Server Status Parser Component for PHP

This project aims to deliver an easy to use component to read the apache server status for a configured list of hosts and gain information about that.

This component is relying on the apache mod_status and the undocumented query "?notable" ("?auto" does not contain information about the pid).

The build status of the current master branch is tracked by Travis CI: Build StatusLatest stable

The scrutinizer status is: code quality

Take a look on openhub.net.

The current change log can be found here.

Project Goals

  • provides simple access to process information (deals with strings)
  • provides detailed access to all information (building a lot of objects)

Why?

Let me give you an scenario I got on my desk and had to solve it.

Given

As a maintainer of an infrastructure with multiple apache HTTP servers, I need to know if a given process (identified by its pid, a infrastructure wide unique identifier and its uri) is still running or not. Sometimes I know the IP Address of the server where process is running, mostly all I have is a pid, the unique identifier and the uri. And finally, it is allowed to use the apache server status but no ssh command execution.

How To Use

Because of the shipped with builders, it is really easy to getting started with. If you want to use your application instance pooling, use the builders as manual how to plumper things together.

There are two different kind of builders, one (AbstractStorageBuilder) gives you the control over where to fetch and how much to fetch information. The second one (ParserBuilder) simple uses the result from the first one to parse the information into domain objects.

//If you want to parse the whole apache server status// and create domain objects out of the information.//begin of dependencies$parserBuilderFactory = new \Net\Bazzline\Component\ApacheServerStatusParser\Service\Builder\ParserBuilderFactory();
$storageBuilder = new \Net\Bazzline\Component\ApacheServerStatusParser\Service\Builder\RemoteStorageBuilder();
$parserBuilder = $parserBuilderFactory->create();
//end of dependencies//begin of business logic// the following five logical lines are doing the trick$storageBuilder->setUrlToTheApacheStatusFileToParseUpfront('<the url to your apache server status>');
$storageBuilder->selectParseModeAllUpfront();
$storageBuilder->build();
$parserBuilder->setStorageUpfront(
$storageBuilder->andGetStorageAfterTheBuild();
);
$parserBuilder->build();
// and now, do something with the resultvar_dump(
$parserBuilder->andGetListOfDetailOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetInformationOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetScoreboardOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetStatisticOrNullAfterwards()
);
//end of business logic

Example

Examples are placed in the path /example. Because of the two implemented content fetchers, they are devide into the two categories "local" and "remote".

Example Using Local File

cd <project root>/example/local
#if no file path is provided, the shipped with example file will be used
#parse all
php parse_all.php [<string: path to the apache status file to parse>]
#parse detail only
php parse_detail_only.php [<string: path to the apache status file to parse>]
#check if a request is still running
php check_if_a_request_is_still_running <int: pid> [<string: uri path> [<string: path to the example file>]]

Example Using Remote File

cd <project root>/example/remote
#if no file path is provided, the build in example url will be used
#parse all
php remote/parse_all.php [<string: url to the apache status page>]
#parse detail only
php parse_detail_only.php [<string: url to the apache status page>]

Example Output

Parsed Detail

Just one detail.

http_method: GET
ip_address: 198.76.54.42
pid: 22754
status: Ready
uri_authority: example.host.org:80
uri_path_with_query: /

Parsed Information

date_of_built: Oct 06 1983 20:44:43
identifier: first.example.host.org (via 123.45.67.89)
mode_of_mpm: prefork
version: Apache/2.4.10 (Debian)

Parsed Scoreboard

process: _WWW_WWWWKW_....._.W..................................................................................................................................
legend
0: "_" Waiting for Connection,
1: "S" Starting up,
2: "R" Reading Request,
3: "W" Sending Reply,
4: "K" Keepalive (read),
5: "D" DNS Lookup,
6: "C" Closing connection,
7: "L" Logging,
8: "G" Gracefully finishing,
9: "I" Idle cleanup of worker,
10: "." Open slot with no current process

Parsed Statistic

b_per_request: 1667
cpu_load: 584
cpu_usage: u959.08 s127.38 cu1.72 cs.95
current_timestamp: 1485804167
idle_workers: 4
kb_per_request: 57
parent_server_configuration_generation: 1
parent_server_mpm_generation: 1
requests_currently_being_processed: 10
requests_per_second: 283
restart_timestamp: 1485785532
server_load: 1.22 1.05 0.83
server_up_time: 5 hours 10 minutes 35 seconds
total_accesses: 5279
total_traffic: 29.6 MB

Install

By Hand

mkdir -p vendor/net_bazzline/php_component_apache_server_status_parser
cd vendor/net_bazzline/php_component_apache_server_status_parser
git clone https://github.com/bazzline/php_component_apache_server_status_parser .
composer require net_bazzline/php_component_apache_server_status_parser:dev-master

Workflow

  • get content
  • split content into dedicated sections
    • detail
    • information
    • scoreboard
    • statistic
  • parse each section into its fitting domain object

List Of Domain Model

  • DomainModel\Detail
    • dynamic detail information about each worker
  • DomainModel\Information
    • general static information about the environment
  • DomainModel\Scoreboard
    • dynamic and general worker information
  • DomainModel\Statistic
    • dynamic server statistic

List Of Service

  • Service\Builder
    • contains builder classes to kickstart the usage of this component
  • Service\Content\Fetcher
    • contains classes to get the apache status content from somewhere
  • Service\Content\Parser
    • contains classes to create domain objects out of the content
  • Service\Content\Processor
    • contains the class to split the content into logical parts (does the heavy lifting)
  • Service\Content\Storage
    • contains classes to share the logical content parts
  • Service\StateMachine
    • contains a class to ease up splitting the content into logical parts

Notes

Thanks to:

Final Words

Star it if you like it :-). Add issues if you need it. Pull patches if you enjoy it. Write a blog entry if you use it. Donate something if you love it :-].

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jun 7, 2021. It is now read-only.

Repository files navigation

Full Stop

I still like the idea but there is currently no use case to develop it anymore.

Apache Server Status Parser Component for PHP

This project aims to deliver an easy to use component to read the apache server status for a configured list of hosts and gain information about that.

This component is relying on the apache mod_status and the undocumented query "?notable" ("?auto" does not contain information about the pid).

The build status of the current master branch is tracked by Travis CI: Build StatusLatest stable

The scrutinizer status is: code quality

Take a look on openhub.net.

The current change log can be found here.

Project Goals

  • provides simple access to process information (deals with strings)
  • provides detailed access to all information (building a lot of objects)

Why?

Let me give you an scenario I got on my desk and had to solve it.

Given

As a maintainer of an infrastructure with multiple apache HTTP servers, I need to know if a given process (identified by its pid, a infrastructure wide unique identifier and its uri) is still running or not. Sometimes I know the IP Address of the server where process is running, mostly all I have is a pid, the unique identifier and the uri. And finally, it is allowed to use the apache server status but no ssh command execution.

How To Use

Because of the shipped with builders, it is really easy to getting started with. If you want to use your application instance pooling, use the builders as manual how to plumper things together.

There are two different kind of builders, one (AbstractStorageBuilder) gives you the control over where to fetch and how much to fetch information. The second one (ParserBuilder) simple uses the result from the first one to parse the information into domain objects.

//If you want to parse the whole apache server status// and create domain objects out of the information.//begin of dependencies$parserBuilderFactory = new \Net\Bazzline\Component\ApacheServerStatusParser\Service\Builder\ParserBuilderFactory();
$storageBuilder = new \Net\Bazzline\Component\ApacheServerStatusParser\Service\Builder\RemoteStorageBuilder();
$parserBuilder = $parserBuilderFactory->create();
//end of dependencies//begin of business logic// the following five logical lines are doing the trick$storageBuilder->setUrlToTheApacheStatusFileToParseUpfront('<the url to your apache server status>');
$storageBuilder->selectParseModeAllUpfront();
$storageBuilder->build();
$parserBuilder->setStorageUpfront(
$storageBuilder->andGetStorageAfterTheBuild();
);
$parserBuilder->build();
// and now, do something with the resultvar_dump(
$parserBuilder->andGetListOfDetailOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetInformationOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetScoreboardOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetStatisticOrNullAfterwards()
);
//end of business logic

Example

Examples are placed in the path /example. Because of the two implemented content fetchers, they are devide into the two categories "local" and "remote".

Example Using Local File

cd <project root>/example/local
#if no file path is provided, the shipped with example file will be used
#parse all
php parse_all.php [<string: path to the apache status file to parse>]
#parse detail only
php parse_detail_only.php [<string: path to the apache status file to parse>]
#check if a request is still running
php check_if_a_request_is_still_running <int: pid> [<string: uri path> [<string: path to the example file>]]

Example Using Remote File

cd <project root>/example/remote
#if no file path is provided, the build in example url will be used
#parse all
php remote/parse_all.php [<string: url to the apache status page>]
#parse detail only
php parse_detail_only.php [<string: url to the apache status page>]

Example Output

Parsed Detail

Just one detail.

http_method: GET
ip_address: 198.76.54.42
pid: 22754
status: Ready
uri_authority: example.host.org:80
uri_path_with_query: /

Parsed Information

date_of_built: Oct 06 1983 20:44:43
identifier: first.example.host.org (via 123.45.67.89)
mode_of_mpm: prefork
version: Apache/2.4.10 (Debian)

Parsed Scoreboard

process: _WWW_WWWWKW_....._.W..................................................................................................................................
legend
0: "_" Waiting for Connection,
1: "S" Starting up,
2: "R" Reading Request,
3: "W" Sending Reply,
4: "K" Keepalive (read),
5: "D" DNS Lookup,
6: "C" Closing connection,
7: "L" Logging,
8: "G" Gracefully finishing,
9: "I" Idle cleanup of worker,
10: "." Open slot with no current process

Parsed Statistic

b_per_request: 1667
cpu_load: 584
cpu_usage: u959.08 s127.38 cu1.72 cs.95
current_timestamp: 1485804167
idle_workers: 4
kb_per_request: 57
parent_server_configuration_generation: 1
parent_server_mpm_generation: 1
requests_currently_being_processed: 10
requests_per_second: 283
restart_timestamp: 1485785532
server_load: 1.22 1.05 0.83
server_up_time: 5 hours 10 minutes 35 seconds
total_accesses: 5279
total_traffic: 29.6 MB

Install

By Hand

mkdir -p vendor/net_bazzline/php_component_apache_server_status_parser
cd vendor/net_bazzline/php_component_apache_server_status_parser
git clone https://github.com/bazzline/php_component_apache_server_status_parser .
composer require net_bazzline/php_component_apache_server_status_parser:dev-master

Workflow

  • get content
  • split content into dedicated sections
    • detail
    • information
    • scoreboard
    • statistic
  • parse each section into its fitting domain object

List Of Domain Model

  • DomainModel\Detail
    • dynamic detail information about each worker
  • DomainModel\Information
    • general static information about the environment
  • DomainModel\Scoreboard
    • dynamic and general worker information
  • DomainModel\Statistic
    • dynamic server statistic

List Of Service

  • Service\Builder
    • contains builder classes to kickstart the usage of this component
  • Service\Content\Fetcher
    • contains classes to get the apache status content from somewhere
  • Service\Content\Parser
    • contains classes to create domain objects out of the content
  • Service\Content\Processor
    • contains the class to split the content into logical parts (does the heavy lifting)
  • Service\Content\Storage
    • contains classes to share the logical content parts
  • Service\StateMachine
    • contains a class to ease up splitting the content into logical parts

Notes

Thanks to:

Final Words

Star it if you like it :-). Add issues if you need it. Pull patches if you enjoy it. Write a blog entry if you use it. Donate something if you love it :-].

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Jun 7, 2021. It is now read-only.

Repository files navigation

Full Stop

I still like the idea but there is currently no use case to develop it anymore.

Apache Server Status Parser Component for PHP

This project aims to deliver an easy to use component to read the apache server status for a configured list of hosts and gain information about that.

This component is relying on the apache mod_status and the undocumented query "?notable" ("?auto" does not contain information about the pid).

The build status of the current master branch is tracked by Travis CI: Build StatusLatest stable

The scrutinizer status is: code quality

Take a look on openhub.net.

The current change log can be found here.

Project Goals

  • provides simple access to process information (deals with strings)
  • provides detailed access to all information (building a lot of objects)

Why?

Let me give you an scenario I got on my desk and had to solve it.

Given

As a maintainer of an infrastructure with multiple apache HTTP servers, I need to know if a given process (identified by its pid, a infrastructure wide unique identifier and its uri) is still running or not. Sometimes I know the IP Address of the server where process is running, mostly all I have is a pid, the unique identifier and the uri. And finally, it is allowed to use the apache server status but no ssh command execution.

How To Use

Because of the shipped with builders, it is really easy to getting started with. If you want to use your application instance pooling, use the builders as manual how to plumper things together.

There are two different kind of builders, one (AbstractStorageBuilder) gives you the control over where to fetch and how much to fetch information. The second one (ParserBuilder) simple uses the result from the first one to parse the information into domain objects.

//If you want to parse the whole apache server status// and create domain objects out of the information.//begin of dependencies$parserBuilderFactory = new \Net\Bazzline\Component\ApacheServerStatusParser\Service\Builder\ParserBuilderFactory();
$storageBuilder = new \Net\Bazzline\Component\ApacheServerStatusParser\Service\Builder\RemoteStorageBuilder();
$parserBuilder = $parserBuilderFactory->create();
//end of dependencies//begin of business logic// the following five logical lines are doing the trick$storageBuilder->setUrlToTheApacheStatusFileToParseUpfront('<the url to your apache server status>');
$storageBuilder->selectParseModeAllUpfront();
$storageBuilder->build();
$parserBuilder->setStorageUpfront(
$storageBuilder->andGetStorageAfterTheBuild();
);
$parserBuilder->build();
// and now, do something with the resultvar_dump(
$parserBuilder->andGetListOfDetailOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetInformationOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetScoreboardOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetStatisticOrNullAfterwards()
);
//end of business logic

Example

Examples are placed in the path /example. Because of the two implemented content fetchers, they are devide into the two categories "local" and "remote".

Example Using Local File

cd <project root>/example/local
#if no file path is provided, the shipped with example file will be used
#parse all
php parse_all.php [<string: path to the apache status file to parse>]
#parse detail only
php parse_detail_only.php [<string: path to the apache status file to parse>]
#check if a request is still running
php check_if_a_request_is_still_running <int: pid> [<string: uri path> [<string: path to the example file>]]

Example Using Remote File

cd <project root>/example/remote
#if no file path is provided, the build in example url will be used
#parse all
php remote/parse_all.php [<string: url to the apache status page>]
#parse detail only
php parse_detail_only.php [<string: url to the apache status page>]

Example Output

Parsed Detail

Just one detail.

http_method: GET
ip_address: 198.76.54.42
pid: 22754
status: Ready
uri_authority: example.host.org:80
uri_path_with_query: /

Parsed Information

date_of_built: Oct 06 1983 20:44:43
identifier: first.example.host.org (via 123.45.67.89)
mode_of_mpm: prefork
version: Apache/2.4.10 (Debian)

Parsed Scoreboard

process: _WWW_WWWWKW_....._.W..................................................................................................................................
legend
0: "_" Waiting for Connection,
1: "S" Starting up,
2: "R" Reading Request,
3: "W" Sending Reply,
4: "K" Keepalive (read),
5: "D" DNS Lookup,
6: "C" Closing connection,
7: "L" Logging,
8: "G" Gracefully finishing,
9: "I" Idle cleanup of worker,
10: "." Open slot with no current process

Parsed Statistic

b_per_request: 1667
cpu_load: 584
cpu_usage: u959.08 s127.38 cu1.72 cs.95
current_timestamp: 1485804167
idle_workers: 4
kb_per_request: 57
parent_server_configuration_generation: 1
parent_server_mpm_generation: 1
requests_currently_being_processed: 10
requests_per_second: 283
restart_timestamp: 1485785532
server_load: 1.22 1.05 0.83
server_up_time: 5 hours 10 minutes 35 seconds
total_accesses: 5279
total_traffic: 29.6 MB

Install

By Hand

mkdir -p vendor/net_bazzline/php_component_apache_server_status_parser
cd vendor/net_bazzline/php_component_apache_server_status_parser
git clone https://github.com/bazzline/php_component_apache_server_status_parser .
composer require net_bazzline/php_component_apache_server_status_parser:dev-master

Workflow

  • get content
  • split content into dedicated sections
    • detail
    • information
    • scoreboard
    • statistic
  • parse each section into its fitting domain object

List Of Domain Model

  • DomainModel\Detail
    • dynamic detail information about each worker
  • DomainModel\Information
    • general static information about the environment
  • DomainModel\Scoreboard
    • dynamic and general worker information
  • DomainModel\Statistic
    • dynamic server statistic

List Of Service

  • Service\Builder
    • contains builder classes to kickstart the usage of this component
  • Service\Content\Fetcher
    • contains classes to get the apache status content from somewhere
  • Service\Content\Parser
    • contains classes to create domain objects out of the content
  • Service\Content\Processor
    • contains the class to split the content into logical parts (does the heavy lifting)
  • Service\Content\Storage
    • contains classes to share the logical content parts
  • Service\StateMachine
    • contains a class to ease up splitting the content into logical parts

Notes

Thanks to:

Final Words

Star it if you like it :-). Add issues if you need it. Pull patches if you enjoy it. Write a blog entry if you use it. Donate something if you love it :-].

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jun 7, 2021. It is now read-only.

Repository files navigation

Full Stop

I still like the idea but there is currently no use case to develop it anymore.

Apache Server Status Parser Component for PHP

This project aims to deliver an easy to use component to read the apache server status for a configured list of hosts and gain information about that.

This component is relying on the apache mod_status and the undocumented query "?notable" ("?auto" does not contain information about the pid).

The build status of the current master branch is tracked by Travis CI: Build StatusLatest stable

The scrutinizer status is: code quality

Take a look on openhub.net.

The current change log can be found here.

Project Goals

  • provides simple access to process information (deals with strings)
  • provides detailed access to all information (building a lot of objects)

Why?

Let me give you an scenario I got on my desk and had to solve it.

Given

As a maintainer of an infrastructure with multiple apache HTTP servers, I need to know if a given process (identified by its pid, a infrastructure wide unique identifier and its uri) is still running or not. Sometimes I know the IP Address of the server where process is running, mostly all I have is a pid, the unique identifier and the uri. And finally, it is allowed to use the apache server status but no ssh command execution.

How To Use

Because of the shipped with builders, it is really easy to getting started with. If you want to use your application instance pooling, use the builders as manual how to plumper things together.

There are two different kind of builders, one (AbstractStorageBuilder) gives you the control over where to fetch and how much to fetch information. The second one (ParserBuilder) simple uses the result from the first one to parse the information into domain objects.

//If you want to parse the whole apache server status// and create domain objects out of the information.//begin of dependencies$parserBuilderFactory = new \Net\Bazzline\Component\ApacheServerStatusParser\Service\Builder\ParserBuilderFactory();
$storageBuilder = new \Net\Bazzline\Component\ApacheServerStatusParser\Service\Builder\RemoteStorageBuilder();
$parserBuilder = $parserBuilderFactory->create();
//end of dependencies//begin of business logic// the following five logical lines are doing the trick$storageBuilder->setUrlToTheApacheStatusFileToParseUpfront('<the url to your apache server status>');
$storageBuilder->selectParseModeAllUpfront();
$storageBuilder->build();
$parserBuilder->setStorageUpfront(
$storageBuilder->andGetStorageAfterTheBuild();
);
$parserBuilder->build();
// and now, do something with the resultvar_dump(
$parserBuilder->andGetListOfDetailOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetInformationOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetScoreboardOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetStatisticOrNullAfterwards()
);
//end of business logic

Example

Examples are placed in the path /example. Because of the two implemented content fetchers, they are devide into the two categories "local" and "remote".

Example Using Local File

cd <project root>/example/local
#if no file path is provided, the shipped with example file will be used
#parse all
php parse_all.php [<string: path to the apache status file to parse>]
#parse detail only
php parse_detail_only.php [<string: path to the apache status file to parse>]
#check if a request is still running
php check_if_a_request_is_still_running <int: pid> [<string: uri path> [<string: path to the example file>]]

Example Using Remote File

cd <project root>/example/remote
#if no file path is provided, the build in example url will be used
#parse all
php remote/parse_all.php [<string: url to the apache status page>]
#parse detail only
php parse_detail_only.php [<string: url to the apache status page>]

Example Output

Parsed Detail

Just one detail.

http_method: GET
ip_address: 198.76.54.42
pid: 22754
status: Ready
uri_authority: example.host.org:80
uri_path_with_query: /

Parsed Information

date_of_built: Oct 06 1983 20:44:43
identifier: first.example.host.org (via 123.45.67.89)
mode_of_mpm: prefork
version: Apache/2.4.10 (Debian)

Parsed Scoreboard

process: _WWW_WWWWKW_....._.W..................................................................................................................................
legend
0: "_" Waiting for Connection,
1: "S" Starting up,
2: "R" Reading Request,
3: "W" Sending Reply,
4: "K" Keepalive (read),
5: "D" DNS Lookup,
6: "C" Closing connection,
7: "L" Logging,
8: "G" Gracefully finishing,
9: "I" Idle cleanup of worker,
10: "." Open slot with no current process

Parsed Statistic

b_per_request: 1667
cpu_load: 584
cpu_usage: u959.08 s127.38 cu1.72 cs.95
current_timestamp: 1485804167
idle_workers: 4
kb_per_request: 57
parent_server_configuration_generation: 1
parent_server_mpm_generation: 1
requests_currently_being_processed: 10
requests_per_second: 283
restart_timestamp: 1485785532
server_load: 1.22 1.05 0.83
server_up_time: 5 hours 10 minutes 35 seconds
total_accesses: 5279
total_traffic: 29.6 MB

Install

By Hand

mkdir -p vendor/net_bazzline/php_component_apache_server_status_parser
cd vendor/net_bazzline/php_component_apache_server_status_parser
git clone https://github.com/bazzline/php_component_apache_server_status_parser .
composer require net_bazzline/php_component_apache_server_status_parser:dev-master

Workflow

  • get content
  • split content into dedicated sections
    • detail
    • information
    • scoreboard
    • statistic
  • parse each section into its fitting domain object

List Of Domain Model

  • DomainModel\Detail
    • dynamic detail information about each worker
  • DomainModel\Information
    • general static information about the environment
  • DomainModel\Scoreboard
    • dynamic and general worker information
  • DomainModel\Statistic
    • dynamic server statistic

List Of Service

  • Service\Builder
    • contains builder classes to kickstart the usage of this component
  • Service\Content\Fetcher
    • contains classes to get the apache status content from somewhere
  • Service\Content\Parser
    • contains classes to create domain objects out of the content
  • Service\Content\Processor
    • contains the class to split the content into logical parts (does the heavy lifting)
  • Service\Content\Storage
    • contains classes to share the logical content parts
  • Service\StateMachine
    • contains a class to ease up splitting the content into logical parts

Notes

Thanks to:

Final Words

Star it if you like it :-). Add issues if you need it. Pull patches if you enjoy it. Write a blog entry if you use it. Donate something if you love it :-].

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jun 7, 2021. It is now read-only.

Repository files navigation

Full Stop

I still like the idea but there is currently no use case to develop it anymore.

Apache Server Status Parser Component for PHP

This project aims to deliver an easy to use component to read the apache server status for a configured list of hosts and gain information about that.

This component is relying on the apache mod_status and the undocumented query "?notable" ("?auto" does not contain information about the pid).

The build status of the current master branch is tracked by Travis CI: Build StatusLatest stable

The scrutinizer status is: code quality

Take a look on openhub.net.

The current change log can be found here.

Project Goals

  • provides simple access to process information (deals with strings)
  • provides detailed access to all information (building a lot of objects)

Why?

Let me give you an scenario I got on my desk and had to solve it.

Given

As a maintainer of an infrastructure with multiple apache HTTP servers, I need to know if a given process (identified by its pid, a infrastructure wide unique identifier and its uri) is still running or not. Sometimes I know the IP Address of the server where process is running, mostly all I have is a pid, the unique identifier and the uri. And finally, it is allowed to use the apache server status but no ssh command execution.

How To Use

Because of the shipped with builders, it is really easy to getting started with. If you want to use your application instance pooling, use the builders as manual how to plumper things together.

There are two different kind of builders, one (AbstractStorageBuilder) gives you the control over where to fetch and how much to fetch information. The second one (ParserBuilder) simple uses the result from the first one to parse the information into domain objects.

//If you want to parse the whole apache server status// and create domain objects out of the information.//begin of dependencies$parserBuilderFactory = new \Net\Bazzline\Component\ApacheServerStatusParser\Service\Builder\ParserBuilderFactory();
$storageBuilder = new \Net\Bazzline\Component\ApacheServerStatusParser\Service\Builder\RemoteStorageBuilder();
$parserBuilder = $parserBuilderFactory->create();
//end of dependencies//begin of business logic// the following five logical lines are doing the trick$storageBuilder->setUrlToTheApacheStatusFileToParseUpfront('<the url to your apache server status>');
$storageBuilder->selectParseModeAllUpfront();
$storageBuilder->build();
$parserBuilder->setStorageUpfront(
$storageBuilder->andGetStorageAfterTheBuild();
);
$parserBuilder->build();
// and now, do something with the resultvar_dump(
$parserBuilder->andGetListOfDetailOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetInformationOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetScoreboardOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetStatisticOrNullAfterwards()
);
//end of business logic

Example

Examples are placed in the path /example. Because of the two implemented content fetchers, they are devide into the two categories "local" and "remote".

Example Using Local File

cd <project root>/example/local
#if no file path is provided, the shipped with example file will be used
#parse all
php parse_all.php [<string: path to the apache status file to parse>]
#parse detail only
php parse_detail_only.php [<string: path to the apache status file to parse>]
#check if a request is still running
php check_if_a_request_is_still_running <int: pid> [<string: uri path> [<string: path to the example file>]]

Example Using Remote File

cd <project root>/example/remote
#if no file path is provided, the build in example url will be used
#parse all
php remote/parse_all.php [<string: url to the apache status page>]
#parse detail only
php parse_detail_only.php [<string: url to the apache status page>]

Example Output

Parsed Detail

Just one detail.

http_method: GET
ip_address: 198.76.54.42
pid: 22754
status: Ready
uri_authority: example.host.org:80
uri_path_with_query: /

Parsed Information

date_of_built: Oct 06 1983 20:44:43
identifier: first.example.host.org (via 123.45.67.89)
mode_of_mpm: prefork
version: Apache/2.4.10 (Debian)

Parsed Scoreboard

process: _WWW_WWWWKW_....._.W..................................................................................................................................
legend
0: "_" Waiting for Connection,
1: "S" Starting up,
2: "R" Reading Request,
3: "W" Sending Reply,
4: "K" Keepalive (read),
5: "D" DNS Lookup,
6: "C" Closing connection,
7: "L" Logging,
8: "G" Gracefully finishing,
9: "I" Idle cleanup of worker,
10: "." Open slot with no current process

Parsed Statistic

b_per_request: 1667
cpu_load: 584
cpu_usage: u959.08 s127.38 cu1.72 cs.95
current_timestamp: 1485804167
idle_workers: 4
kb_per_request: 57
parent_server_configuration_generation: 1
parent_server_mpm_generation: 1
requests_currently_being_processed: 10
requests_per_second: 283
restart_timestamp: 1485785532
server_load: 1.22 1.05 0.83
server_up_time: 5 hours 10 minutes 35 seconds
total_accesses: 5279
total_traffic: 29.6 MB

Install

By Hand

mkdir -p vendor/net_bazzline/php_component_apache_server_status_parser
cd vendor/net_bazzline/php_component_apache_server_status_parser
git clone https://github.com/bazzline/php_component_apache_server_status_parser .
composer require net_bazzline/php_component_apache_server_status_parser:dev-master

Workflow

  • get content
  • split content into dedicated sections
    • detail
    • information
    • scoreboard
    • statistic
  • parse each section into its fitting domain object

List Of Domain Model

  • DomainModel\Detail
    • dynamic detail information about each worker
  • DomainModel\Information
    • general static information about the environment
  • DomainModel\Scoreboard
    • dynamic and general worker information
  • DomainModel\Statistic
    • dynamic server statistic

List Of Service

  • Service\Builder
    • contains builder classes to kickstart the usage of this component
  • Service\Content\Fetcher
    • contains classes to get the apache status content from somewhere
  • Service\Content\Parser
    • contains classes to create domain objects out of the content
  • Service\Content\Processor
    • contains the class to split the content into logical parts (does the heavy lifting)
  • Service\Content\Storage
    • contains classes to share the logical content parts
  • Service\StateMachine
    • contains a class to ease up splitting the content into logical parts

Notes

Thanks to:

Final Words

Star it if you like it :-). Add issues if you need it. Pull patches if you enjoy it. Write a blog entry if you use it. Donate something if you love it :-].

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Jun 7, 2021. It is now read-only.

Repository files navigation

Full Stop

I still like the idea but there is currently no use case to develop it anymore.

Apache Server Status Parser Component for PHP

This project aims to deliver an easy to use component to read the apache server status for a configured list of hosts and gain information about that.

This component is relying on the apache mod_status and the undocumented query "?notable" ("?auto" does not contain information about the pid).

The build status of the current master branch is tracked by Travis CI: Build StatusLatest stable

The scrutinizer status is: code quality

Take a look on openhub.net.

The current change log can be found here.

Project Goals

  • provides simple access to process information (deals with strings)
  • provides detailed access to all information (building a lot of objects)

Why?

Let me give you an scenario I got on my desk and had to solve it.

Given

As a maintainer of an infrastructure with multiple apache HTTP servers, I need to know if a given process (identified by its pid, a infrastructure wide unique identifier and its uri) is still running or not. Sometimes I know the IP Address of the server where process is running, mostly all I have is a pid, the unique identifier and the uri. And finally, it is allowed to use the apache server status but no ssh command execution.

How To Use

Because of the shipped with builders, it is really easy to getting started with. If you want to use your application instance pooling, use the builders as manual how to plumper things together.

There are two different kind of builders, one (AbstractStorageBuilder) gives you the control over where to fetch and how much to fetch information. The second one (ParserBuilder) simple uses the result from the first one to parse the information into domain objects.

//If you want to parse the whole apache server status// and create domain objects out of the information.//begin of dependencies$parserBuilderFactory = new \Net\Bazzline\Component\ApacheServerStatusParser\Service\Builder\ParserBuilderFactory();
$storageBuilder = new \Net\Bazzline\Component\ApacheServerStatusParser\Service\Builder\RemoteStorageBuilder();
$parserBuilder = $parserBuilderFactory->create();
//end of dependencies//begin of business logic// the following five logical lines are doing the trick$storageBuilder->setUrlToTheApacheStatusFileToParseUpfront('<the url to your apache server status>');
$storageBuilder->selectParseModeAllUpfront();
$storageBuilder->build();
$parserBuilder->setStorageUpfront(
$storageBuilder->andGetStorageAfterTheBuild();
);
$parserBuilder->build();
// and now, do something with the resultvar_dump(
$parserBuilder->andGetListOfDetailOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetInformationOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetScoreboardOrNullAfterwards()
);
var_dump(
$parserBuilder->andGetStatisticOrNullAfterwards()
);
//end of business logic

Example

Examples are placed in the path /example. Because of the two implemented content fetchers, they are devide into the two categories "local" and "remote".

Example Using Local File

cd <project root>/example/local
#if no file path is provided, the shipped with example file will be used
#parse all
php parse_all.php [<string: path to the apache status file to parse>]
#parse detail only
php parse_detail_only.php [<string: path to the apache status file to parse>]
#check if a request is still running
php check_if_a_request_is_still_running <int: pid> [<string: uri path> [<string: path to the example file>]]

Example Using Remote File

cd <project root>/example/remote
#if no file path is provided, the build in example url will be used
#parse all
php remote/parse_all.php [<string: url to the apache status page>]
#parse detail only
php parse_detail_only.php [<string: url to the apache status page>]

Example Output

Parsed Detail

Just one detail.

http_method: GET
ip_address: 198.76.54.42
pid: 22754
status: Ready
uri_authority: example.host.org:80
uri_path_with_query: /

Parsed Information

date_of_built: Oct 06 1983 20:44:43
identifier: first.example.host.org (via 123.45.67.89)
mode_of_mpm: prefork
version: Apache/2.4.10 (Debian)

Parsed Scoreboard

process: _WWW_WWWWKW_....._.W..................................................................................................................................
legend
0: "_" Waiting for Connection,
1: "S" Starting up,
2: "R" Reading Request,
3: "W" Sending Reply,
4: "K" Keepalive (read),
5: "D" DNS Lookup,
6: "C" Closing connection,
7: "L" Logging,
8: "G" Gracefully finishing,
9: "I" Idle cleanup of worker,
10: "." Open slot with no current process

Parsed Statistic

b_per_request: 1667
cpu_load: 584
cpu_usage: u959.08 s127.38 cu1.72 cs.95
current_timestamp: 1485804167
idle_workers: 4
kb_per_request: 57
parent_server_configuration_generation: 1
parent_server_mpm_generation: 1
requests_currently_being_processed: 10
requests_per_second: 283
restart_timestamp: 1485785532
server_load: 1.22 1.05 0.83
server_up_time: 5 hours 10 minutes 35 seconds
total_accesses: 5279
total_traffic: 29.6 MB

Install

By Hand

mkdir -p vendor/net_bazzline/php_component_apache_server_status_parser
cd vendor/net_bazzline/php_component_apache_server_status_parser
git clone https://github.com/bazzline/php_component_apache_server_status_parser .
composer require net_bazzline/php_component_apache_server_status_parser:dev-master

Workflow

  • get content
  • split content into dedicated sections
    • detail
    • information
    • scoreboard
    • statistic
  • parse each section into its fitting domain object

List Of Domain Model

  • DomainModel\Detail
    • dynamic detail information about each worker
  • DomainModel\Information
    • general static information about the environment
  • DomainModel\Scoreboard
    • dynamic and general worker information
  • DomainModel\Statistic
    • dynamic server statistic

List Of Service

  • Service\Builder
    • contains builder classes to kickstart the usage of this component
  • Service\Content\Fetcher
    • contains classes to get the apache status content from somewhere
  • Service\Content\Parser
    • contains classes to create domain objects out of the content
  • Service\Content\Processor
    • contains the class to split the content into logical parts (does the heavy lifting)
  • Service\Content\Storage
    • contains classes to share the logical content parts
  • Service\StateMachine
    • contains a class to ease up splitting the content into logical parts

Notes

Thanks to:

Final Words

Star it if you like it :-). Add issues if you need it. Pull patches if you enjoy it. Write a blog entry if you use it. Donate something if you love it :-].