{"id":36979802,"url":"https://github.com/naingaunglwin-dev/timetracker","last_synced_at":"2026-05-10T23:01:56.344Z","repository":{"id":269424886,"uuid":"907372859","full_name":"naingaunglwin-dev/timetracker","owner":"naingaunglwin-dev","description":"A lightweight time tracker for php","archived":false,"fork":false,"pushed_at":"2026-05-10T21:02:59.000Z","size":49,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-05-10T22:29:54.340Z","etag":null,"topics":["php","time-tracker","timetracker"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/naingaunglwin-dev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-12-23T12:40:26.000Z","updated_at":"2026-05-10T20:59:34.000Z","dependencies_parsed_at":null,"dependency_job_id":"a9c5f1ad-0957-4dcb-962d-6b34323322a5","html_url":"https://github.com/naingaunglwin-dev/timetracker","commit_stats":null,"previous_names":["naingaunglwin-dev/timetracker"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/naingaunglwin-dev/timetracker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naingaunglwin-dev%2Ftimetracker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naingaunglwin-dev%2Ftimetracker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naingaunglwin-dev%2Ftimetracker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naingaunglwin-dev%2Ftimetracker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/naingaunglwin-dev","download_url":"https://codeload.github.com/naingaunglwin-dev/timetracker/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naingaunglwin-dev%2Ftimetracker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32874701,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-10T13:40:02.631Z","status":"ssl_error","status_checked_at":"2026-05-10T13:40:02.145Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["php","time-tracker","timetracker"],"created_at":"2026-01-13T22:49:24.601Z","updated_at":"2026-05-10T23:01:56.339Z","avatar_url":"https://github.com/naingaunglwin-dev.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# TimeTracker\n\n\u003ca href=\"https://github.com/naingaunglwin-dev/timetracker/actions\"\u003e\u003cimg src=\"https://github.com/naingaunglwin-dev/timetracker/actions/workflows/tests.yml/badge.svg\" alt=\"GitHub CI Status\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/naingaunglwin-dev/dotenv/\"\u003e\u003cimg src=\"https://img.shields.io/badge/coverage-100%25-green\" alt=\"Code Coverage\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/naingaunglwin-dev/dotenv/blob/main/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-blue.svg\" alt=\"License\"\u003e\u003c/a\u003e\n\n\u003c/div\u003e\n\n## Contributing\n- This is an open-source library, and contributions are welcome.\n- If you have any suggestions, bug reports, or feature requests, please open an issue or submit a pull request on the project repository.\n\n## Requirement\n- **PHP** version 8.3 or newer is required\n- composer\n\n## Installation via Composer\n\u003e If Composer is not installed, follow the [official guide](https://getcomposer.org/download/).\n\n1. Create a `composer.json` file at your project root directory (if you don't have one):\n```json\n{\n  \"require\": {\n    \"naingaunglwin-dev/timetracker\": \"^2.0\"\n  }\n}\n```\n\n- Run the following command in your terminal from the project's root directory:\n```bash\ncomposer install\n```\n\nIf you already have `composer.json` file in your project, just run this command in your terminal,\n```bash\ncomposer require naingaunglwin-dev/timetracker\n```\n\n## Usage\n- In your php file,\n```php\n\u003c?php\n\nrequire 'vendor/autoload.php';\n\n$tracker = new NAL\\TimeTracker\\TimeTracker();\n\n$tracker-\u003estart('test');\n\necho 'hello world\u003cbr\u003e';\nsleep(3);\n\n$tracker-\u003estop('test');\n\necho $tracker-\u003ecalculate('test')\n        -\u003eget();\n\n// Output:\n// hello world\n// 3.0019600391388\n```\n\n### Convert to different unit\n- By default, the unit is in seconds (s). You can convert to other predefined units like milliseconds (ms), microseconds (us), and more:\n```php\n$tracker-\u003estart('test');\n\necho 'hello world\u003cbr\u003e';\nsleep(3);\n\n$tracker-\u003estop('test');\n\necho $tracker-\u003ecalculate('test')\n        -\u003econvert('ms')\n        -\u003eget();\n\n// Output:\n// hello world\n// 3014.9321556091\n```\n\n### Add custom unit\n- You can define custom units based on seconds (for example, converting seconds to custom units):\n```php\n$tracker-\u003estart('test');\n\necho 'hello world\u003cbr\u003e';\nsleep(3);\n\n$tracker-\u003estop('test');\n\n// Add a custom unit definition (1 second = 10 custom units)\n$tracker-\u003eaddUnitDefinition('testunit', '*', 10);\n\necho $tracker-\u003ecalculate('test')\n        -\u003econvert('testunit')\n        -\u003eget();\n\n// Output:\n// hello world\n// 30.037958621979\n```\n\n### Format output\n- You can format the output of the calculated time using named placeholders:\n```php\n$tracker-\u003estart('test');\n\necho 'hello world\u003cbr\u003e';\nsleep(3);\n\n$tracker-\u003estop('test');\n\necho $tracker-\u003ecalculate('test')\n        -\u003econvert('ms')\n        -\u003eformat('Executed in {time}{unit}') // Default: '{time} {unit}'\n        -\u003eget();\n\n// Output:\n// hello world\n// Executed in 3009.4430446625ms\n```\n\n### Access raw and formatted result values\n- `Result::get()` returns the raw value by default, or the formatted string after `format()` is used.\n- `Result::value()` always returns the raw numeric value.\n- `Result::unit()` returns the current unit.\n- `Result::toArray()` returns a structured representation of the result.\n```php\n$result = $tracker-\u003ecalculate('test')\n        -\u003econvert('ms')\n        -\u003eformat('Executed in {time}{unit}');\n\necho $result-\u003eget();\n// Executed in 3009.4430446625ms\n\necho $result-\u003evalue();\n// 3009.4430446625\n\necho $result-\u003eunit();\n// ms\n\nprint_r($result-\u003etoArray());\n\n// Output:\n// Array\n// (\n//     [time] =\u003e 3009.4430446625\n//     [unit] =\u003e ms\n//     [formatted] =\u003e Executed in 3009.4430446625ms\n// )\n```\n\n### Time tracking with callback function\n- You can track time for a callback function and get both the callback result and the execution time:\n```php\nclass Conversation\n{\n    public function greet($time){\n        return 'good ' . $time;\n    }\n}\n\n$watch = \\NAL\\TimeTracker\\TimeTracker::watch(\n    function (Conversation $conv, $time) {\n        sleep(3);\n        return $conv-\u003egreet($time) . '\u003cbr\u003edo something at ' . $time;\n    },\n    ['time' =\u003e 'evening'] // parameters variableName =\u003e value\n);\n\necho $watch['result'];\necho $watch['time']-\u003econvert('ms')-\u003eformat('{time}{unit}')-\u003eget();\n```\n- Example output:\n```php\narray (size=2)\n  'result' =\u003e string 'good evening\u003cbr\u003edo something at evening'\n  'time' =\u003e object(NAL\\TimeTracker\\Result)\n```\n\n### Checking timer states\n\nThe following methods help you check timer states and get currently active timers.\n\n#### Check if a timer has started\n```php\n$tracker-\u003estart('download');\n\nif ($tracker-\u003eisStarted('download')) {\n    echo \"Download timer is started.\";\n}\n\n// Output:\n// Download timer is started.\n```\n\n#### Check if a timer has stopped\n```php\n$tracker-\u003estart('process');\n\nsleep(1);\n\n$tracker-\u003estop('process');\n\nif ($tracker-\u003eisStopped('process')) {\n    echo \"Process timer is stopped.\";\n}\n\n// Output:\n// Process timer is stopped.\n```\n\n#### Get currently active timers\n```php\n$tracker-\u003estart('task1');\n$tracker-\u003estart('task2');\n$tracker-\u003estop('task1');\n\nprint_r($tracker-\u003egetActiveTimers());\n\n// Output:\n// Array\n// (\n//     [0] =\u003e task2\n// )\n```\n\n#### Check timer status\n```php\n$tracker-\u003estart('import');\n\necho $tracker-\u003estatus('import');\n\n// Output:\n// in progress\n```\n\n#### Check if a completed timer exists\n```php\n$tracker-\u003estart('report');\n$tracker-\u003estop('report');\n\nif ($tracker-\u003eexists('report')) {\n    echo \"Report timer exists.\";\n}\n\n// Output:\n// Report timer exists.\n```\n\n### Get all durations\n- `durations()` returns completed timers converted to the requested unit. By default, it converts to milliseconds and formats each value as `{time} {unit}`.\n```php\n$tracker-\u003estart('task1');\nusleep(10000);\n$tracker-\u003estop('task1');\n\n$tracker-\u003estart('task2');\nusleep(20000);\n$tracker-\u003estop('task2');\n\nprint_r($tracker-\u003edurations());\n\n// Output:\n// Array\n// (\n//     [task1] =\u003e 10.123 ms\n//     [task2] =\u003e 20.456 ms\n// )\n```\n\n- Pass an empty format string if you want raw numeric durations:\n```php\nprint_r($tracker-\u003edurations('ms', ''));\n\n// Output:\n// Array\n// (\n//     [task1] =\u003e 10.123\n//     [task2] =\u003e 20.456\n// )\n```\n\n### Record laps\n- Laps mark checkpoints inside a running timer.\n```php\n$tracker-\u003estart('build');\n\nusleep(10000);\n$tracker-\u003elap('build', 'Dependencies installed');\n\nusleep(20000);\n$tracker-\u003elap('build', 'Assets compiled');\n\n$tracker-\u003estop('build');\n\nprint_r($tracker-\u003egetLaps('build'));\n\n// Output:\n// Array\n// (\n//     [0] =\u003e Array\n//         (\n//             [description] =\u003e Dependencies installed\n//             [time] =\u003e 1760000000.1234\n//         )\n//     [1] =\u003e Array\n//         (\n//             [description] =\u003e Assets compiled\n//             [time] =\u003e 1760000000.5678\n//         )\n// )\n```\n\n### Pause and resume a timer\n- Paused time is excluded from the final calculated duration.\n```php\n$tracker-\u003estart('download');\n\nusleep(10000);\n$tracker-\u003epause('download', 'Waiting for network');\n\nusleep(50000);\n$tracker-\u003eresume('download', 'Network resumed');\n\nusleep(10000);\n$tracker-\u003estop('download');\n\necho $tracker-\u003ecalculate('download')\n        -\u003econvert('ms')\n        -\u003eformat('{time} {unit}')\n        -\u003eget();\n```\n\n### Inspect a timer\n- `inspect()` returns the raw tracked data for a timer, including start, end, pause, resume, lap, and status values.\n```php\nprint_r($tracker-\u003einspect('download'));\n\n// Output:\n// Array\n// (\n//     [start] =\u003e 1760000000.1234\n//     [end] =\u003e 1760000000.2345\n//     [paused] =\u003e Array(...)\n//     [resumed] =\u003e Array(...)\n//     [status] =\u003e completed\n//     [laps] =\u003e Array(...)\n// )\n```\n\n### Reset timers\n```php\n$tracker-\u003ereset('download'); // Reset one timer\n\n$tracker-\u003ereset(); // Reset all timers\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnaingaunglwin-dev%2Ftimetracker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnaingaunglwin-dev%2Ftimetracker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnaingaunglwin-dev%2Ftimetracker/lists"}